db.restaurants.explain().aggregate([
{$match: {"address.zipcode": {$in: ["10314", "11208", "11219"]}}},
{$match: {"grades": {$elemMatch: {score: {$gte: 1}}}}},
{$group: {_id: "$borough", count: {$sum: 1} }},
{$sort: {count: -1} }
]);
根据MongoDB文档,它应该返回我可以迭代的游标并查看有关所有管道阶段的数据:
该操作返回一个光标,其中包含有关聚合管道处理的详细信息的文档。
但是,聚合命令仅返回前两个匹配阶段的解释信息:
{
"stages" : [
{
"$cursor" : {
"query" : {
"$and" : [
{
"address.zipcode" : {
"$in" : [
"10314",
"11208",
"11219"
]
}
},
{
"grades" : {
"$elemMatch" : {
"score" : {
"$gte" : 1.0
}
}
}
}
]
},
"fields" : {
"borough" : 1,
"_id" : 0
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.restaurants",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"grades" : {
"$elemMatch" : {
"score" : {
"$gte" : 1.0
}
}
}
},
{
"address.zipcode" : {
"$in" : [
"10314",
"11208",
"11219"
]
}
}
]
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"$and" : [
{
"grades" : {
"$elemMatch" : {
"score" : {
"$gte" : 1.0
}
}
}
},
{
"address.zipcode" : {
"$in" : [
"10314",
"11208",
"11219"
]
}
}
]
},
"direction" : "forward"
},
"rejectedPlans" : []
}
}
},
{
"$group" : {
"_id" : "$borough",
"count" : {
"$sum" : {
"$const" : 1.0
}
}
}
},
{
"$sort" : {
"sortKey" : {
"count" : -1
}
}
}
],
"ok" : 1.0
}
返回的对象根本不像光标
如果我将聚合结果保存到变量然后尝试使用游标方法(hasNext(), next()
等)迭代它,我会得到以下结果:
TypeError: result.next is not a function : @(shell):1:1
如何查看所有管道步骤的信息?
感谢
答案 0 :(得分:1)
<强> 1。解释信息
Explain()返回查询的获胜计划,即数据库在管道中处理文档之前如何获取文档。
这里,因为adress.zipcode
和grades
没有被索引,所以db执行COLLSCAN
,即迭代db中的所有文档并查看它们是否匹配
之后,您将文档分组并对结果进行排序。在先前提取的文档中,操作已在内存中完成。这些字段没有编入索引,因此这里不能使用特殊计划
此处有更多信息:explain results
<强> 2。关于聚合查询的Explain()不返回游标
由于某种原因,聚合查询的explain()
不会返回游标,而是直接返回BSON对象(与explain()
查询中的find()
不同)
这可能是一个错误,但在文档中没有任何相关内容。
无论如何,你可以这样做:
var explain = db.restaurants.explain().aggregate([
{$match: {"address.zipcode": {$in: ["10314", "11208", "11219"]}}},
{$match: {"grades": {$elemMatch: {score: {$gte: 1}}}}},
{$group: {_id: "$borough", count: {$sum: 1} }},
{$sort: {count: -1} }
]);
printjson(explain)