【问题标题】:MongoDB aggregation explain provides data only about first stagesMongoDB 聚合说明仅提供有关第一阶段的数据
【发布时间】:2018-06-23 22:46:54
【问题描述】:

我在 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

如何查看所有流水线步骤的信息?
谢谢

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    1.解释信息

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

    这里,因为adress.zipcodegrades没有被索引,db执行COLLSCAN,即遍历db中的所有文档,看看它们是否匹配

    之后,您对文档进行分组并对结果进行排序。这些操作是在“内存中”在先前获取的文档上完成的。这些字段没有被索引,所以这里不能使用特殊的计划

    更多信息在这里:explain results

    2。聚合查询上的 Explain() 不返回游标

    由于某种原因,聚合查询上的 explain() 不会返回游标,而是直接返回 BSON 对象(与 find() 查询上的 explain() 不同)

    这可能是一个错误,但文档中没有关于此的内容。

    无论如何,你可以这样做:

    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)
    

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2021-07-05
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多