Mongodb 的条件在形式上有区别吗
{$and: [{a: 'aaa'}, {b: 'bbb'}]}
和没有 $and 运算符的 sam 条件
{a: 'aaa', b: 'bbb'}
有人告诉我 $and 运算符会减慢查询速度。是真的吗?谢谢。
最佳答案
这些条件之间没有区别。回答此类问题的最佳方法是查看 explain
输出以了解 Mongo 实际如何处理这样的查询。
如果您查看下面查询计划中的 winningPlan
,您会发现它们完全相同!仅仅因为 $and
在 {a: 'aaa', b: 'bbb'}
中不是显式的并不意味着它不存在:它只是隐式的。
> db.my_test_coll.createIndex({a: 1, b: 1});//添加索引
没有$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
}
关于带 $and 运算符和不带运算符的条件之间的 Mongodb 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54750316/