MongoDB聚合解释仅提供有关第一阶段的数据

时间:2018-01-15 10:05:31

标签: mongodb aggregation-framework

我在test database

上运行以下聚合查询
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

如何查看所有管道步骤的信息?
感谢

1 个答案:

答案 0 :(得分:1)

<强> 1。解释信息

Explain()返回查询的获胜计划,即数据库在管道中处理文档之前如何获取文档。

这里,因为adress.zipcodegrades没有被索引,所以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)