繁体   English   中英

如何使用 mongoDB 查询从对象数组中查找匹配元素

[英]How to find matching elements from an array of objects using mongoDB query

我想找到所有匹配产品“bat”的元素。 我的数据库结构如下

[
  {
    "key": 1,
    "productArray" : [
      {
         "requirementId": 5,
         "product": "bat"
      },
      {
        "requirementId": 6,
        "product": "Pen"
      },
     ]
  },
  {
    "key": 2
  },
  {
    "key": 3,
    "productArray": [
      {
        "requirementId": 1,
        "product": "bat"
      },
      {
        "requirementId": 2,
        "product": "Pen"
      },
      {
        "requirementId": 3,
        "product": "bat"
      },
      {
        "requirementId": 4,
        "product": "bat"
      }
    ]
  }
]

我尝试了以下查询,但此查询仅返回一个匹配元素。

db.collection.find({"key": 3}, {"productArray": {"$elemMatch": { "product": "bat"}}})

上述查询结果如下

[
 {
    "_id": ObjectId("5a934e000102030405000002"),
    "productArray": [
      {
        "product": "bat",
        "requirementId": 1
      }
    ]
 }
]

我可以得到预期的 output 我的问题如下使用 mongodb 查询或者我应该使用另一种方法来处理我的情况:

我预期的output如下

[
  {
    "productArray": [
    {
      "requirementId": 1,
      "product": "bat"
    },
    {
      "requirementId": 3,
      "product": "bat"
    },
    {
      "requirementId": 4,
      "product": "bat"
    }
    ]
 }
]

如您所见, $elemMatch$都是惰性运算符,并返回匹配的第一个元素。

您可以在 find (mongoDB 4.4+) 中添加管道,但更好地支持聚合:

db.collection.aggregate({
  $match: {
    key: 3
  }
},
{
  $project: {
    productArray: {
      "$filter": {
        "input": "$productArray",
        "as": "p",
        "cond": {
          $eq: [
            "$$p.product",
            "bat"
          ]
        }
      }
    }
  }
})

现场版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM