如何从MONGO文档中的嵌入数组中选择多个元素

时间:2016-07-21 11:09:01

标签: mongodb mongodb-query aggregation-framework nosql

我有一组文件,每份文件都是以下格式:

{
    "file_id" : 2,
    "data" : [ 
        {
            "category" : "Auto1",
            "code_id" : 1
        }, 
        {
            "category" : "Auto2",
            "code_id" : 2
        }, 
        {
            "category" : "Auto3",
            "code_id" : 3
        }, 
        {
            "category" : "Workers1",
            "code_id" : 4
        }, 
        {
            "category" : "Workers2",
            "code_id" : 5
        }, 
        {
            "category" : "Workers3",
            "code_id" : 6
        }
   ]
}

其他类似的文档在那里,我想在数据数组中查询file_idcode_id

查询应该与file_id = 2, data.code_id = [2,4,5,8]类似。 结果应包含带有嵌入文档的文档(多个嵌入文档),其中包含上述指定数组中的code_id

我试过

db.collectionName.findOne({
    "file_id": 1, 
    "data.code_id": { "$in": [2,4,5,8] }
}, { "file": 1, "data.$": 1 })

这会返回官方文档中所写的单个嵌入式文档,但我想要多个嵌入式文档,我该怎么办?

必需输出

{
    "file_id" : 2,
    "data" : [
        {
            "category" : "Auto2",
            "code_id" : 2
        },
        {
            "category" : "Workers1",
            "code_id" : 4
        },
        {
            "category" : "Workers2",
            "code_id" : 5
        }
   ]
}

1 个答案:

答案 0 :(得分:1)

最好使用 $filter 运算符,该运算符允许您根据指定的条件选择要返回的数组子集。至于条件,使用 $setIsSubset 运算符,它接受两个数组,当第一个数组是第二个数组的子集时返回true,包括当第一个数组等于第二个数组时,返回false否则。

var codeIds = [2,4,5,8];
db.collectionName.aggregate([
    { "$match": { "data.code_id": { "$in": codeIds }, "file_id": 2 } },
    { 
        "$project": {
            "file_id": 1,
            "data": {
                "$filter": {
                    "input": '$data',
                    "as": 'item',
                    "cond": { "$setIsSubset": [ ["$$item.code_id"], codeIds ] }
                }
            }
        }
    }
])