如何使用 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
      }
    ]
 }
]

我可以使用 mongodb 查询获得我的问题的预期输出吗?或者我应该使用另一种方法来解决我的问题:

我的预期输出如下

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

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

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

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

Live version