我正在尝试使用aggregate
管道识别数组中两个键值对匹配的文档。具体来说,如果我想查找一个数组包含user_attribute.Name = Quests_In_Progress
和user_attribute.Value =3
的文档。以下是我试图匹配的此类文档的示例。
如果我使用
db.myCollection.aggregate({
$match: {
"user_attribute.Name": "Quests_In_Progress",
"user_attribute.Value": "3"
}
})
它将匹配数组的一个元素中包含Quests_In_Progress
的user_attribute.Name的每个文档,并包含" 3"对于user_attribute.Value,无论它们是否存在于数组的同一元素中
即
db.myCollection.aggregate({
$match: {
"user_attribute.Name": "Quests_In_Progress",
"user_attribute.Value": "0"
}
})
将匹配同一个文档,因为数组的一个元素有一个键:Value:0
的值对和数组的另一个元素包含Quests_In_Progress
的键:值对。
我想要做的是识别在数组的一个元素中满足这两个条件的文档。
我尝试使用$elemMatch
执行此操作,但我无法使其工作。此外,汇总文档并未表明$elemMatch
有效,所以也许这就是为什么我无法让它发挥作用。
最后,我需要使用聚合管道,因为在找到这些文档之后还有很多其他事情需要做 - 特别是解开它们。
{
"_id": ObjectId("5555bb32de938ce667f78ce00"),
"user_attribute": [{
"Value": "Facebook",
"Name": "Social_Connection"
}, {
"Name": "Total_Fireteam_Missions_Initiated",
"Value": "0"
}, {
"Name": "Quests_Completed",
"Value": "3"
}, {
"Name": "Item_Slots_Owned",
"Value": "36"
}, {
"Name": "Quests_In_Progress",
"Value": "3"
}, {
"Name": "Player_Progression",
"Value": "0"
}, {
"Value": "1",
"Name": "Characters_Owned"
}, {
"Name": "Quests_Started",
"Value": "6"
}, {
"Name": "Total_Friends",
"Value": "0"
}, {
"Name": "Device_Type",
"Value": "Phone"
}]
}
答案 0 :(得分:3)
尝试使用$ elemMatch
db.myCollection.aggregate([{$match: {"user_attribute": {$elemMatch: {"Name":"Quests_In_Progress", "Value":"0"}}}}, { $out, "temp"}])
该查询将找到任何拥有其数组元素“Quests_In_Progress”且值为0并将其放入集合temp的人