首页 > 解决方案 > Spring mongo:使用 IN 子句查询子文档数组以获取匹配的子文档

问题描述

嗨有一个集合如下:

客户偏好

{
  clntId: 1234,
  clntType: "internal",
  status: "PROCESSED",
  prefs: [
    {
      name: "AAA",
      value: "value1"
    },
    {
      name: "BBB",
      value: "value2"
    },
    {
      name: "CCC",
      value: "value3"
    }
  ]
}

如果我通过 找到prefs.name $in ("AAA", "CCC"),我将获得所有子文档以及父文档。然后我尝试prefs.$: 1在@Query 的字段参数中使用,但它只返回第一个匹配的子文档。

期望的输出

{
  clntId: 1234,
  clntType: "internal",
  status: "PROCESSED",
  prefs: [
    {
      name: "AAA",
      value: "value1"
    },
    {
      name: "CCC",
      value: "value3"
    }
  ]
}

有没有办法通过使用@Query注释来获取 AAA 和 CCC 子文档。如果没有,那么如何使用聚合来做到这一点?对 mongo 来说仍然很新,所以无法找到获得所需结果的方法。

标签: mongodbmongodb-query

解决方案


你需要project什么是需要的。

{
 "prefs.$":1,
 "clntType":1,
 "status":1
}

询问:

db.collection.find({
  "prefs.name": "AAA"
},
{
  "prefs.$": 1,
  "clntType": 1,
  "status": 1
})

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "clntType": "internal",
    "prefs": [
      {
        "name": "AAA",
        "value": "value1"
      }
    ],
    "status": "PROCESSED"
  }
]

获取所有子文档:

db.collection.aggregate([
  {
    "$unwind": "$prefs"
  },
  {
    "$match": {
      "prefs.name": {
        "$in": [
          "AAA",
          "CCC"
        ]
      }
    }
  }
])

如果你想再次对所有数据进行分组,你可以

db.collection.aggregate([
  {
    "$unwind": "$prefs"
  },
  {
    "$match": {
      "prefs.name": {
        "$in": [
          "AAA",
          "CCC"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "data": {
        "$push": "$$ROOT"
      }
    }
  }
])

推荐阅读