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

Mongodb difference between condition with $and operator and without the operator

表格

中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}); // adding an index

没有 $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
}