【问题标题】:Mongodb - find query based on an element of an arrayMongodb - 根据数组元素查找查询
【发布时间】:2020-09-09 18:37:07
【问题描述】:

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

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

【问题讨论】:

    标签: mongodb mongodb-query aggregate


    【解决方案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()

    【讨论】:

    • 我认为您的建议是使用聚合。因为 $filter 在“查找”中不支持。所以我根据你的回答创建的工作答案是 db.inventory.aggregate({ $match:{"item": "journal"}}, { $project: {instock: { $filter: { input: "$instock" , cond: { $in: [5, "$$this.ele"] }}}}})
    • 是的,完美,你的 mongodb 版本是多少?
    • 我使用的是 4.2.1
    • 更新的答案,它在 mongodb 4.4 中的支持,很高兴您已经解决了聚合()的问题。
    【解决方案2】:

    我建议你展开instock数组,然后过滤数据,最后如果你愿意你可以将结果按item分组以获得想要的结果。

    这里是一个例子:solution

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多