我今天也在想同样的事情,偶然发现了 Romain 的答案。虽然我想亲眼看看这一点,但可以通过对两个聚合的解释轻松完成;
db.verpakking.explain().aggregate([
{ "$match": {type: "VERPAKT"} },
{ "$match": {ras: "CherryStar"} },
]);
这会导致以下输出:
{
"waitedMS" : NumberLong(0),
"stages" : [
{
"$cursor" : {
"query" : {
"$and" : [
{
"type" : "VERPAKT"
},
{
"ras" : "CherryStar"
}
]
},
"queryPlanner" : {
"plannerVersion" : NumberInt(1),
"namespace" : "denberk.verpakking",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"ras" : {
"$eq" : "CherryStar"
}
},
{
"type" : {
"$eq" : "VERPAKT"
}
}
]
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"ras" : {
"$eq" : "CherryStar"
}
},
{
"type" : {
"$eq" : "VERPAKT"
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : [
]
}
}
}
],
"ok" : NumberInt(1)
}
虽然
db.verpakking.explain().aggregate([
{ "$match": {type: "VERPAKT", ras: "CherryStar"} },
]);
输出结果:
{
"waitedMS" : NumberLong(0),
"stages" : [
{
"$cursor" : {
"query" : {
"type" : "VERPAKT",
"ras" : "CherryStar"
},
"queryPlanner" : {
"plannerVersion" : NumberInt(1),
"namespace" : "denberk.verpakking",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"ras" : {
"$eq" : "CherryStar"
}
},
{
"type" : {
"$eq" : "VERPAKT"
}
}
]
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"ras" : {
"$eq" : "CherryStar"
}
},
{
"type" : {
"$eq" : "VERPAKT"
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : [
]
}
}
}
],
"ok" : NumberInt(1)
}
正如您所见,这完全一样,除了“查询”部分(这是正常的,因为我们的查询是不同的)。这证明无论您使用两个单独的连续 $match-pipeline 还是一个组合的 $match-pipeline,解析后的查询都将完全相同。