0

我正在玩 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" }}})

那么这两者有什么区别呢?

4

1 回答 1

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

于 2013-08-14T13:29:26.620 回答