逻辑查询操作符


逻辑与、或、非以及取反操作。


逻辑操作符

作用

参数

$and


{$and:[{<expressionl>},{<expression2>},…,{<expressionN>}]}

$or


{$or:[{<expressionl>},{<expression2>},…,{<expressionN>}]}

$nor


{$nor:[{<expressionl>},{<expression2>},…,{<expressionN>}]}

$not

取反

{field:{$not:{<operator-expression>}}}



逻辑查询操作符实例


var db = connect("localhost:27017/test");
    
    db.col.drop();
    
    var bulk = db.col.initializeUnorderedBulkOp();
    
    // 测试数据
    
    var doc1 = {name : "joe", age : 20}
    
    bulk.insert(doc1);
    
    var doc2 = {name : "joe", age : 31}
    
    bulk.insert(doc2);
    
    var doc3 = {name : "jack", age : 21}
    
    bulk.insert(doc3);
    
    var doc4 = {name : "John", age : null}
    
    bulk.insert(doc4);
    
    //执行插入操作
    
    bulk.execute();
    
    print("========find - $and 逻辑操作符的使用=======")
    
    /*
    
     $and  &&  且逻辑操作符    选择满足所有表达式的文档
    
     { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
    
     注意:1. and 操作符使用的是”短路运算“,即如果第一个表达式返回 false的话,不会再计算后面的表达式
    
          2. and 操作符有隐式和显式两种  隐式的可以使用 逗号 连接多个表达式
    
          3. 一般情况下隐式和显式两种方式是等价的,但有的时候只能显式使用$and
    
    */
    
    var cursor = db.col.find(
    
                    {
    
                      //$and: [ { age:{$gt:21}}, { age:{ $lte:31} } ]   //age>21 && age<=31
    
                      //age:{$gte:20,$lte:31}
    
                      $and: [ 
    
                              { $or:[ { age:19 },{ age:21 } ] },        //age=19或age=21
    
                              { $or:[ { name:"joe" },{ name:"jack" } ] }
    
                            ]  
    
                    } 
    
                );
    
    printjson(cursor.toArray());
    
     
    
     
    
     
    
     
    
    print("========find - $nor 逻辑操作符的使用=======")
    
    /*
    
     $nor   用于查询集合中不满足参数数组中列出的所有条件的文档
    
     { $nor: [ { <expression1> }, { <expression2> }, ...  { <expressionN> } ] }
    
    */
    
    var cursor = db.col.find(
    
                    {
    
                       $nor:[ 
    
                              { name:"joe"  },
    
                              { name:"jack" }  
    
                            ]  
    
                    });
    
    printjson(cursor.toArray());
    
     
    
     
    
    print("========find - $not 操作符的使用=======")
    
    /* 
    
       $not     对表达式取反     
    
       { field: { $not: { <operator-expression> } } }
    
    */
    
    var cursor = db.col.find(
    
                     {  
    
                        age:{ $not: { $gt:22,$lte:30 } }   //age<=22 或  age>30 或 null
    
                     });                           
    
    printjson(cursor.toArray());


运行结果


C:\>mongo --quiet find_logic.js
    
    ========find - $and 逻辑操作符的使用=======
    
    [
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfd1"),
    
                    "name" : "jack",
    
                    "age" : 21
    
            }
    
    ]
    
    ========find - $nor 逻辑操作符的使用=======
    
    [
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfd2"),
    
                    "name" : "John",
    
                    "age" : null
    
            }
    
    ]
    
    ========find - $not/$gt/$lte 操作符的使用=======
    
    [
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfcf"),
    
                    "name" : "joe",
    
                    "age" : 20
    
            },
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfd0"),
    
                    "name" : "joe",
    
                    "age" : 31
    
            },
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfd1"),
    
                    "name" : "jack",
    
                    "age" : 21
    
            },
    
            {
    
                    "_id" : ObjectId("56e569373f52f0472ccbcfd2"),
    
                    "name" : "John",
    
                    "age" : null
    
            }
    
    ]