带 $and 运算符和不带运算符的条件之间的 Mongodb 区别

标签 mongodb filter operators

Mongodb 的条件在形式上有区别吗

{$and: [{a: 'aaa'}, {b: 'bbb'}]} 

和没有 $and 运算符的 sam 条件

{a: 'aaa', b: 'bbb'}

有人告诉我 $and 运算符会减慢查询速度。是真的吗?谢谢。

最佳答案

这些条件之间没有区别。回答此类问题的最佳方法是查看 explain输出以了解 Mongo 实际如何处理这样的查询。

如果您查看下面查询计划中的 winningPlan,您会发现它们完全相同!仅仅因为 $and{a: 'aaa', b: 'bbb'} 中不是显式的并不意味着它不存在:它只是隐式的。

> db.my_test_coll.createIndex({a: 1, b: 1});//添加索引

没有$and:

> db.my_test_coll.find({a: 'aaa', b: 'bbb'}).explain()
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.my_test_coll",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "a" : {
                        "$eq" : "aaa"
                    }
                },
                {
                    "b" : {
                        "$eq" : "bbb"
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "a" : 1,
                    "b" : 1
                },
                "indexName" : "a_1_b_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "a" : [ ],
                    "b" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "a" : [
                        "[\"aaa\", \"aaa\"]"
                    ],
                    "b" : [
                        "[\"bbb\", \"bbb\"]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "ok" : 1
}

使用$and:

> db.my_test_coll.find({$and: [{a: 'aaa'}, {b: 'bbb'}]}).explain()
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.my_test_coll",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "a" : {
                        "$eq" : "aaa"
                    }
                },
                {
                    "b" : {
                        "$eq" : "bbb"
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "a" : 1,
                    "b" : 1
                },
                "indexName" : "a_1_b_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "a" : [ ],
                    "b" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "a" : [
                        "[\"aaa\", \"aaa\"]"
                    ],
                    "b" : [
                        "[\"bbb\", \"bbb\"]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "ok" : 1
}

关于带 $and 运算符和不带运算符的条件之间的 Mongodb 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54750316/

相关文章:

mongodb - 使用持久卷运行 mongo 会引发错误 - Kubernetes

单机上的 MongoDB 副本集

filter - ** 在 Phing 中是什么意思?

php - 3个不同的等于

C# - 不能在 lambda 表达式中使用 "is"运算符

javascript - 为什么 undefined == undefined 是 true 而不是 undefined <= undefined?

c# - 在 MongoDB 中计数不正确

node.js - Mongoose 使用不同的外键加入两个不同的集合

c++ - directshow中的CSource和CSourceStream有什么区别?

javascript - 如何使用对象数组过滤数组对象