我有一组文件,每份文件都是以下格式:
{
"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_id
和code_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
}
]
}
答案 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 ] }
}
}
}
}
])