Mongodb的条件在形式上有区别吗?
{$and: [{a: 'aaa'}, {b: 'bbb'}]} 和不带$and算子的sam条件
{a: 'aaa', b: 'bbb'}有人告诉我$and操作符减慢了查询速度。是真的吗?谢谢。
发布于 2019-02-18 15:53:50
这些条件之间没有区别。回答这样的问题的最好方法是查看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
}https://stackoverflow.com/questions/54750316
复制相似问题