代码之家  ›  专栏  ›  技术社区  ›  Sreeragh A R

在MongoDB中,如果没有索引字段,字段索引如何影响文档的排序顺序?

  •  0
  • Sreeragh A R  · 技术社区  · 6 年前

    我有一个收藏 学生 几乎没有医生

    [{id:1, name:'AA'}, {id:2, name:'BB'}]
    

    我正在获取按文档中不存在的字段排序的文档

    db.students.find().sort({marks: -1})
    

    它按这个顺序给我文件

    db.students.createIndex({'marks':1})
    

    然后调用相同的查询

    db.students.find().sort({marks:-1})
    

    订单改变了!!

    [{id:2, name:'BB'},{id:1, name:'AA'}]
    

    为字段编制索引如何影响缺少该字段的文档的排序顺序?

    笔记 :这可能不是一个有效的示例。但我的问题是类似的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    4 年前

    Mongodb将在两个不同的时间执行排序。

    1. 查询时间(该字段上没有索引)
    2. 由于这个原因,对于同一个查询,您得到了不同的结果。

    无索引:

    当我们在mongodb中执行排序(排序字段上没有索引)时,mongodb将通过扫描整个集合在查询时间内开始对集合进行排序。

    排序的方向将是向前的(偶数标记:-1),即它将首先按插入顺序(id值)接触文档。

    带索引:

    您按升序在标记字段上创建了索引(索引只是生成以键为标记的B树)。

    当我们尝试用标记1对集合进行排序时,我们将按索引顺序得到相同的结果。

    您可以在执行这些查询时获得有关这些查询的更多详细信息 explain() 在他们身上。

    db.students2.find().sort({marks:-1}).explain()
    {
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "stackoverflow.students2",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ ]
        },
        "winningPlan" : {
            "stage" : "SORT",
            "sortPattern" : {
                "marks" : -1
            },
            "inputStage" : {
                "stage" : "SORT_KEY_GENERATOR",
                "inputStage" : {
                    "stage" : "COLLSCAN",
                    "filter" : {
                        "$and" : [ ]
                    },
                    "direction" : "forward"
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "sys2030",
        "port" : 27017,
        "version" : "3.2.22",
        "gitVersion" : "105adca0d443f9a1a5abd608fd7133840a68dd"
    },
    "ok" : 1
    }
    

    我们没有索引,所以mongodb在查询时开始扫描它。

    带索引:

    db.students.find().sort({marks:-1}).explain()
    {
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "stackoverflow.students",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [ ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "marks" : 1
                },
                "indexName" : "marks_1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "backward",
                "indexBounds" : {
                    "marks" : [
                        "[MaxKey, MinKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "sys2030",
        "port" : 27017,
        "version" : "3.2.22",
        "gitVersion" : "105adca0d443f9a1a5abd608fd7133840a68dd"
    },
    "ok" : 1
    }
    

    我们有索引,所以mongodb开始使用它并简单地向后返回结果(标记:-1)。

    这就是为什么当我们在集合较大时执行排序时,monogodb会给出错误:使用大量数据进行排序,而不使用索引。

    进一步阅读 :

    https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/

    https://docs.mlab.com/indexing/