我是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
上执行代码。
答案 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 }
});
因此返回的行数不同。希望它有所帮助。