【问题标题】:Do $exists and $in/nin count as equality queries for non-prefix sorts?$exists 和 $in/nin 是否算作非前缀排序的相等查询?
【发布时间】:2015-07-12 15:38:56
【问题描述】:

http://docs.mongodb.org/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index

索引

{ a: 1, b: 1, c: 1}

支持这个查询:

db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } )

是否也支持

db.data.find( { b: 3, a: {$exists: true} } ).sort( { c: 1 } )
db.data.find( { b: {$in: [3,4]}, a: 4 } ).sort( { c: 1 } )
db.data.find( { b: {$nin: [3,4]}, a: {$exists: false} } ).sort( { c: 1 } )

【问题讨论】:

    标签: mongodb mongodb-indexes


    【解决方案1】:

    所有查询都将使用索引进行检索,但仅使用第二个进行排序,因为其他查询使用非相等条件的运算符。

    您可以通过使用 .explain() 运行查询来证明这一点

    请参阅下面这 3 个查询的解释输出(来自 MongoDB 2.6.3),省略了不必要的字段。 "cursor" 显示使用的索引,"indexBounds" 显示索引键的上下界。 "scanAndOrder" : false 表示该索引也用于排序。

    "indexBounds" 很重要,因为您可以看到相等条件 - 例如,请注意 "$exists" : false 是一个相等条件(为 null)并且可能会使用索引,而 "$exists" : true 是一个范围。

    另请参阅documentation on explain,它对于了解索引使用情况和诊断性能问题非常有用。

    db.data.find( { b: 3, a: {$exists: true} } ).sort( { c: 1 } ).explain()
    {
        "cursor" : "BtreeCursor a_1_b_1_c_1",
        "scanAndOrder" : true,
        "indexBounds" : {
            "a" : [
                [
                    {
                        "$minElement" : 1
                    },
                    {
                        "$maxElement" : 1
                    }
                ]
            ],
            "b" : [
                [
                    3,
                    3
                ]
            ],
            "c" : [
                [
                    {
                        "$minElement" : 1
                    },
                    {
                        "$maxElement" : 1
                    }
                ]
            ]
        },
    }
    

    ,

    db.data.find( { b: {$in: [3,4]}, a: 4 } ).sort( { c: 1 } ).explain()
    {
        "clauses" : [
            {
                "cursor" : "BtreeCursor a_1_b_1_c_1",
                "scanAndOrder" : false,
                "indexBounds" : {
                    "a" : [
                        [
                            4,
                            4
                        ]
                    ],
                    "b" : [
                        [
                            3,
                            3
                        ]
                    ],
                    "c" : [
                        [
                            {
                                "$minElement" : 1
                            },
                            {
                                "$maxElement" : 1
                            }
                        ]
                    ]
                }
            },
            {
                "cursor" : "BtreeCursor a_1_b_1_c_1",
                "scanAndOrder" : false,
                "indexBounds" : {
                    "a" : [
                        [
                            4,
                            4
                        ]
                    ],
                    "b" : [
                        [
                            4,
                            4
                        ]
                    ],
                    "c" : [
                        [
                            {
                                "$minElement" : 1
                            },
                            {
                                "$maxElement" : 1
                            }
                        ]
                    ]
                }
            }
        ],
    }    
    

    ,

    db.data.find( { b: {$nin: [3,4]}, a: {$exists: false} } ).sort( { c: 1 } ).explain()
    {
        "cursor" : "BtreeCursor a_1_b_1_c_1",
        "scanAndOrder" : true,        
        "indexBounds" : {
            "a" : [
                [
                    null,
                    null
                ]
            ],
            "b" : [
                [
                    {
                        "$minElement" : 1
                    },
                    3
                ],
                [
                    3,
                    4
                ],
                [
                    4,
                    {
                        "$maxElement" : 1
                    }
                ]
            ],
            "c" : [
                [
                    {
                        "$minElement" : 1
                    },
                    {
                        "$maxElement" : 1
                    }
                ]
            ]
        },
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2020-04-28
      • 2014-09-16
      相关资源
      最近更新 更多