0

私は mongoDB をいじっていますが、2 つのクエリの違いがわかりません。

私は次のコレクションを使用します:

{
    "_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"
    ]
}

正しい同じ結果を返す 2 つのクエリ ( objectId 520b79869971eb1a0fdd0ad4 のクエリ) は次のとおりです。

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


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

では、これら2つの違いは何ですか?

4

1 に答える 1

0

違いは、$elemMatch単一の配列要素の項目を検索することです。

このソリューション:

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

その userId とその providerId を持つが、場合によっては の異なる項目にあるユーザーを検索しますlinkedProviders。たとえば、クエリlinkedProviders[0].userIdの最初linkedProviders[1].providerIdの部分に一致し、2 番目の部分に一致する場合、ドキュメント全体 (つまり、ユーザー) がそのクエリに一致します。

一方で、

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

インデックス値 (前の例では 0 と 1) がドキュメント内で同じ場合、つまり、1 つの配列要素が両方に一致する場合にのみ一致します。

にキーと値のマッピングが 1 つしかない場合は$elemMatch、キーと値のマッピングが直接適用されたクエリと同じことを行う必要があります。

詳細: http://docs.mongodb.org/manual/reference/operator/elemMatch/#op._S_elemMatch

于 2013-08-14T13:29:26.620 に答える