Mongodb在Implicit AND中发现方法混淆

时间:2014-09-10 07:48:17

标签: mongodb mongodb-query nosql

我是mongodb的新手我最近开始学习基本语法。我正在尝试使用find方法的运算符,并且在尝试Implicit AND时遇到了一个令人困惑的情况。

我的收藏 mathtable 400个文件如下:

{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b2")  , "index" : 1   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b3")  , "index" : 2   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b4")  , "index" : 3   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b5")  , "index" : 4   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b6")  , "index" : 5   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b7")  , "index" : 6   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b8")  , "index" : 7   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4b9")  , "index" : 8   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4ba")  , "index" : 9   }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bb")  , "index" : 10  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bc")  , "index" : 11  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bd")  , "index" : 12  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4be")  , "index" : 13  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4bf")  , "index" : 14  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c0")  , "index" : 15  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c1")  , "index" : 16  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c2")  , "index" : 17  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c3")  , "index" : 18  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c4")  , "index" : 19  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4c5")  , "index" : 20  }
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4d1")  , "index" : 1   }
..
..
{ "_id" : ObjectId("540efc2bd8af78d9b0f5d4z5")  , "index" : 20 }

mathtable集合中有400行:

  • index的值范围为1 to 20
  • 对于index的每个值,20个条目具有不同的_id值。

我正在尝试以下两个操作,并期待相同的结果,因为它们都是implicit AND个案例。

计算值大于5的偶数index值。

  • 使用经典的EXPLICIT AND(结果为160条记录):

     db.mathtable.count({ 
                $and: [
                { index: { $mod: [2,0] } },         
                { index: { $gt: 5 } }     
                ] 
            });
    
  • 仅使用变量名称一次(结果为160条记录):

    db.mathtable.count({ 
                      index : { $mod : [2,0] ,  $gt:5 } 
                      });
    
  • 在每个条件中使用字段名称(结果为300条记录):

    db.mathtable.find({ 
                      index : { $mod : [2,0]} , 
                      index : {$gt:5} 
                     });
    
  • 对每个条件使用字段名称,条件顺序相反(结果为200条记录):

    db.mathtable.find({ 
                      index :  {$gt:5} , 
                      index : { $mod : [2,0]}
                     });
    

在mongoDB文档中没有提到implicit OR(至少我没有找到像implicit AND这样的直接引用。)

在这两种情况下,我都期待相同的记录数(160)。我无法理解为什么上面的代码表现不同。

此外,条件规范的顺序会产生不同数量的结果。根据观察,当多次指定相同的字段时,仅应用find中指定的最后一个条件。 这很奇怪也不正确。

注意:我正在使用Mongo-DB-2.6,并且正在分发附带的mongo shell上执行代码。

1 个答案:

答案 0 :(得分:3)

Json或关联数组或地图does not包含重复的键:

db.mathtable.find({ 
                  index : { $mod : [2,0]} , 
                  index : {$gt:5} 
                 });

以上内容将被视为相当于:

db.mathtable.find({ 
                  index : {$gt:5} 
                 });

第一个条件将被覆盖,

及以下,

db.mathtable.find({ 
                  index :  {$gt:5} , 
                  index : { $mod : [2,0]}
                 });

将等同于

db.mathtable.find({ 
                  index : { $mod : [2,0]}
                 });

然而,在第一种情况下,

db.mathtable.count({ 
            $and: [
            { index: { $mod: [2,0] } },         
            { index: { $gt: 5 } }     
            ] 
        });

$并将两个json文档作为输入并按预期运行。

并且在第二种情况下,count采用没有重复键的单个文档,并按预期运行。

db.mathtable.count({ 
                  index : { $mod : [2,0] ,  $gt:5 } 
                  });

因此返回的行数不同。希望它有所帮助。