这些条件之间没有区别。回答此类问题的最佳方法是查看explain https://docs.mongodb.com/manual/reference/method/cursor.explain/#cursor.explain输出来看看 Mongo 实际上如何处理这样的查询。
如果你看一下winningPlan
在下面的查询计划中,您可以看到它们完全相同!只因为$and
没有明确地{a: 'aaa', b: 'bbb'}
并不意味着它不存在:它只是隐含的。
> db.my_test_coll.createIndex({a: 1, b: 1}); // adding an index
如果没有$and
:
> db.my_test_coll.find({a: 'aaa', b: 'bbb'}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.my_test_coll",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"a" : {
"$eq" : "aaa"
}
},
{
"b" : {
"$eq" : "bbb"
}
}
]
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"a" : 1,
"b" : 1
},
"indexName" : "a_1_b_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"a" : [ ],
"b" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"a" : [
"[\"aaa\", \"aaa\"]"
],
"b" : [
"[\"bbb\", \"bbb\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"ok" : 1
}
随着$and
:
> db.my_test_coll.find({$and: [{a: 'aaa'}, {b: 'bbb'}]}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.my_test_coll",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"a" : {
"$eq" : "aaa"
}
},
{
"b" : {
"$eq" : "bbb"
}
}
]
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"a" : 1,
"b" : 1
},
"indexName" : "a_1_b_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"a" : [ ],
"b" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"a" : [
"[\"aaa\", \"aaa\"]"
],
"b" : [
"[\"bbb\", \"bbb\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"ok" : 1
}