我有以下类型的文档,在该文档中,我必须根据给定的值查找库存元素。即退还ele = 5
处的所有库存。
{"item":"journal",
"instock":[
{ "warehouse":"A", "ele":[2,4,5] },
{ "warehouse":"C", "ele":[8,5,2] },
{ "warehouse":"F", "ele":[3] },
{ "warehouse":"K", "ele":[2,8,4] }
]
}
我尝试使用$ elemMatch,但是它只是产生第一个元素。
db.inventory.find({"item": "journal"}, {"_id": 0, "item": 0, "instock":{$elemMatch: {"ele": {$in: [5]}}} })
但这只是给出:
{ "instock" : [
{ "warehouse" : "A", "ele" : [ 2, 4, 5 ] }
]}
期望是
{ "instock" : [
{ "warehouse" : "A", "ele" : [ 2, 4, 5 ] },
{ "warehouse" : "C", "ele" : [ 8, 5, 2 ] }
]}
我应该如何获得预期的结果?
答案 0 :(得分:1)
$elemMatch
或instock.$
将在find()的投影中返回第一个匹配的文档,
您可以在MongoDB 4.4的投影中使用aggregation expression,在示例中,您可以在投影中使用数组$filter,
db.collection.find({
"item": "journal"
},
{
instock: {
$filter: {
input: "$instock",
cond: { $in: [5, "$$this.ele"] }
}
}
})
对于旧版本,您可以使用上述相同的运算符使用aggregate()
。
答案 1 :(得分:0)
我建议您展开instock
数组,然后过滤数据,最后,如果需要,可以按item
对结果进行分组以获得所需的结果。
以下是一个示例:solution