【问题标题】:Mongodb db.collection.distinct() on aws documentdb doesn't use indexaws documentdb 上的 Mongodb db.collection.distinct() 不使用索引
【发布时间】:2019-04-24 16:26:37
【问题描述】:

过渡到新的 AWS documentDB 服务。目前,在 Mongo 3.2 上。当我运行db.collection.distinct("FIELD_NAME") 时,它会很快返回结果。我做了一个数据库转储到 AWS 文档数据库(Mongo 3.6 兼容),这个简单的查询就卡住了。

这是我的 .explain() 以及工作实例上的索引与 AWS documentdb:

在工作实例上解释函数:

> db.collection.explain().distinct("FIELD_NAME")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "db.collection",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "$and" : [ ]
                },
                "winningPlan" : {
                        "stage" : "PROJECTION",
                        "transformBy" : {
                                "_id" : 0,
                                "FIELD_NAME" : 1
                        },
                        "inputStage" : {
                                "stage" : "DISTINCT_SCAN",
                                "keyPattern" : {
                                        "FIELD_NAME" : 1
                                },
                                "indexName" : "FIELD_INDEX_NAME",
                                "isMultiKey" : false,
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 1,
                                "direction" : "forward",
                                "indexBounds" : {
                                        "FIELD_NAME" : [
                                                "[MinKey, MaxKey]"
                                        ]
                                }
                        }
                },
                "rejectedPlans" : [ ]
        },

在 AWS documentdb 上解释,不起作用:

rs0:PRIMARY> db.collection.explain().distinct("FIELD_NAME")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "db.collection",
                "winningPlan" : {
                        "stage" : "AGGREGATE",
                        "inputStage" : {
                                "stage" : "HASH_AGGREGATE",
                                "inputStage" : {
                                        "stage" : "COLLSCAN"
                                }
                        }
                }
        },
}

这两个实例的索引:

        {
                "v" : 1,
                "key" : {
                        "FIELD_NAME" : 1
                },
                "name" : "FIELD_INDEX_NAME",
                "ns" : "db.collection"
        }

此外,该数据库有几百万个文档,但该“FIELD_NAME”只有大约 20 个不同的值。任何帮助,将不胜感激。

我用 .hint("index_name") 试过了,但是没有用。我尝试清除计划缓存,但得到Feature not supported: planCacheClear

【问题讨论】:

  • 我的印象是,虽然它支持相同的查询操作,但 documentdb 的架构与 mongodb 完全不同,并且 documentdb 缺乏 mongodb 的许多功能,尤其是在聚合方面 (docs.aws.amazon.com/documentdb/latest/developerguide/…)。我知道distinct 是一个“聚合”命令,所以也许它不能很好地支持?
  • 可能值得做一个像db.collection.findOne({FIELD_NAME: value}).explain() 这样的健全性检查来确保索引被正确创建?
  • @willis 我认为你在正确的轨道上。我会看看是否可以解决一些其他问题,并阅读有关聚合管道的更多信息以进行更好的查询。我都试过了:db.fetched.explain().findOne({CLASS:"CALA"})db.fetched.findOne({CLASS:"CALA"}).explain()。他们都抛出了一个错误,比如:[thread1] TypeError: db.fetched.explain(...).findOne is not a functionE QUERY [thread1] TypeError: db.fetched.findOne(...).explain is not a function 谢谢你指出我在正确的轨道上。

标签: amazon-web-services indexing aws-documentdb-mongoapi


【解决方案1】:

COLLSCAN 和 IXSCAN 在这种情况下没有太大区别,都需要扫描所有的文档或索引条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多