2014-05-20 51 views
-1

我有幾個問題試圖找到一個特定的元素,它的數組內有一個特定的值。找到它的數組中的值元素mongo

因此,如果集合包含的對象是這樣的:

{ 
    "_id" : ObjectId("53408df830044f6b43e64904"), 
    "_class" : "my.path.Team", 
    "name" : "a name", 
    "listOfIds" : [ 
     ObjectId("535044b93004ed4738ba3192"), 
     ObjectId("535044b93004ed4738bc3185") 
    ], 
    "anotherId" : ObjectId("535044b93003ed4738b9317e"), 
    "yetAnotherId" : ObjectId("535044a22004ed4738b93101") 
} 

,我需要找到具有內部listOfIds我想我可以用$ elemmatch一個specicific的ObjectId一個特定的元素,但它似乎不工作無內listOfIds項被命名的東西...

我使用

db.team.findOne({anotherId: aVariableInScope.anotherId, listOfIds: { $elemMatch: { aVariableInScope._id }} }); 

但其沒有工作,我所有的例子似乎找到點t Ø陣列它們構造,如:

"listOfIds" : [ 
    "value": ObjectId("535044b93004ed4738ba3192"), 
    "value" :ObjectId("535044b93004ed4738bc3185") 
], 

,然後你可以使用:

db.team.findOne({anotherId: aVariableInScope.anotherId, listOfIds: { $elemMatch: { "value" : aVariableInScope._id }} }); 
+1

你可以使用'$ all' - 'listOfIds:{$ all:{aVariableInScope._id}}' – tymeJV

+0

這不會給我需要的東西。我想獲取listOfIds中所有的元素,其中aVariableInScope._id的值爲 – ricardoespsanto

回答

1

你只需要使用以下查詢:

db.team.findOne({ 
    anotherId: aVariableInScope.anotherId, 
    listOfIds: aVariableInScope._id 
    } 
}); 

按照docs, $ elemMatch只有當你試圖匹配數組元素上的多個字段時纔是必需的。它所說的「期待一個對象」的原因是$ elemMatch需要一個完整的mongo查詢(因爲它是可以傳遞的東西),因爲它是參數。

+0

。但它不會將結果限制在匹配數組中的元素。我認爲這是真正的問題。 –

1

好了一場比賽,你可以這樣做:

db.team.findOne({ 
    "anotherId": aVariableInScope.anotherId, 
    "listOfIds": { 
     "$elemMatch": { 
      "value": aVariableInScope._id 
     } 
    } 
}, 
{ 
    "_class": 1, 
    "name": 1, 
    "listOfIds.$": 1, 
    "anotherId": 1, 
    "yetAnotherId": 1 
}); 

爲了選擇一個匹配的元素使用positional $運營商。

或者爲倍數只使用.aggregate()代替:

db.team.aggregate([ 

    // Matching documents makes sense to reduce the result 
    { "$match": { 
     "anotherId": aVariableInScope.anotherId, 
     "listOfIds": { 
      "$elemMatch": { 
       "value": aVariableInScope._id 
      } 
     } 
    }, 

    // Unwind the array 
    { "$unwind": "$listOfIds" }, 

    // Actually match the members 
    { "$match": { 
     "listOfIds.value": aVariableInScope._id 
    }}, 

    // Group back again if you must 
    { "$group": { 
     "_id": "$_id", 
     "_class": { "$first": "$class" }, 
     "name": { "$first": "$name" }, 
     "listOfIds": { "$push": "$listOfIds" }, 
     "anotherId": { "$first": "$anotherId" }, 
     "yetAnotherId": { "$first": "$yetAnotherId" } 
    }} 
]); 

更多參與,但它返回一個以上的陣列比賽不像是什麼可供.find()