在匹配单个数组中的两个键:值对时,在mongodb中标识文档

时间:2015-08-12 20:28:51

标签: arrays mongodb

我正在尝试使用aggregate管道识别数组中两个键值对匹配的文档。具体来说,如果我想查找一个数组包含user_attribute.Name = Quests_In_Progressuser_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"
    }]
}

1 个答案:

答案 0 :(得分:3)

尝试使用$ elemMatch

db.myCollection.aggregate([{$match: {"user_attribute": {$elemMatch: {"Name":"Quests_In_Progress", "Value":"0"}}}}, { $out, "temp"}])

该查询将找到任何拥有其数组元素“Quests_In_Progress”且值为0并将其放入集合temp的人