Mongodb-根据数组元素查找查询

时间:2020-09-09 18:37:07

标签: mongodb mongodb-query aggregate

我有以下类型的文档,在该文档中,我必须根据给定的值查找库存元素。即退还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 ] }
]}

我应该如何获得预期的结果?

2 个答案:

答案 0 :(得分:1)

$elemMatchinstock.$将在find()的投影中返回第一个匹配的文档,

您可以在MongoDB 4.4的投影中使用aggregation expression,在示例中,您可以在投影中使用数组$filter

db.collection.find({
  "item": "journal"
},
{
  instock: {
    $filter: {
      input: "$instock",
      cond: { $in: [5, "$$this.ele"] }
    }
  }
})

Playground


对于旧版本,您可以使用上述相同的运算符使用aggregate()

答案 1 :(得分:0)

我建议您展开instock数组,然后过滤数据,最后,如果需要,可以按item对结果进行分组以获得所需的结果。

以下是一个示例:solution