我正在玩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" }}})
那么这两者之间有什么区别?
答案 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