两个MongoDB查询结果相同,有什么区别?

时间:2013-08-14 13:08:10

标签: mongodb

我正在玩mongoDB,我无法弄清楚我的两个查询之间有什么区别。

我使用以下集合:

{
    "_id" : ObjectId("520b79869971eb1a0fdd0ad4"),
    "created" : 1376483718636,
    "updated" : 1376483718636,
    "firstName" : "Jakob",
    "lastName" : "D",
    "email" : "jakob.d@test.com",
    "emailValidated" : false,
    "phoneNumber" : "",
    "lastLogin" : 1376483718624,
    "linkedProviders" : [ 
        {
            "userId" : "1XXXXXXXX6",
            "providerId" : "facebook",
            "password" : "",
            "salt" : "",
            "authMethod" : "oauth2",
            "avatarUrl" : ""
            }
        ],
        "userRoles" : [ 
            "ADMIN"
        ]
},
{
    "_id" : ObjectId("520b7dd09971ebcd35dd0ad6"),
    "created" : 1376484816666,
    "updated" : 1376484816666,
    "firstName" : "Jakob",
    "lastName" : "D",
    "email" : "jakob.d@test.com",
    "emailValidated" : false,
    "phoneNumber" : "",
    "lastLogin" : 1376484816666,
    "linkedProviders" : [ 
        {
            "userId" : "jakob.d@test.com",
            "providerId" : "userpass",
            "password" : "7e4aff9e0d90db2318ffcc689c11b66d",
            "salt" : "N1GgNvy3NnS0i5GFDyglQZ9s4CeFNndn",
            "authMethod" : "userPassword",
            "avatarUrl" : ""
        }
    ],
    "userRoles" : [ 
        "ADMIN"
    ]
}

给我正确且相同结果的两个查询(具有objectId 520b79869971eb1a0fdd0ad4 的结果)是:

db.users.find({"linkedProviders.userId":"1XXXXXXXX6","linkedProviders.providerId":"facebook"})


db.users.find({"linkedProviders": {"$elemMatch": {"userId":"1XXXXXXXX6" },"$elemMatch": {"providerId":"facebook" }}})

那么这两者之间有什么区别?

1 个答案:

答案 0 :(得分:0)

区别在于$elemMatch找到一个数组元素的项目。

此解决方案:

db.users.find({
    "linkedProviders.userId": "1XXXXXXXX6",
    "linkedProviders.providerId": "facebook"
})

查找具有该userId和该providerId的任何用户,但可能在linkedProviders中的不同项目中,例如,如果linkedProviders[0].userId与第一个匹配,linkedProviders[1].providerId匹配查询的第二部分,完整文档(即用户)将匹配该查询。

另一方面,

db.users.find({
    "linkedProviders": {
        "$elemMatch": {
            "userId": "1XXXXXXXX6",
            "providerId": "facebook"
        }
    }
})
仅当索引值(前一个示例中的0和1)在文档中相同时,

才匹配,即仅当一个数组元素与两者匹配时才会匹配。

$elemMatch中只有一个键值映射时,它应该与直接应用键值映射的查询相同。

更多信息: http://docs.mongodb.org/manual/reference/operator/elemMatch/#op._S_elemMatch