Spring mongo:使用IN子句查询子文档数组以获取匹配的子文档

时间:2020-07-06 15:26:25

标签: mongodb mongodb-query

您好,收藏如下:

clientPref

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

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

所需的输出

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

有没有一种方法可以通过使用@Query批注获取AAA和CCC子文档。如果不是,那么如何使用聚合呢?对于mongo来说还很新,因此无法找到一种获得期望结果的方法。

1 个答案:

答案 0 :(得分:0)

您需要project

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

play

查询:

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

输出:

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

要获取所有子文档:

Play

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

如果要再次对所有数据进行分组,可以执行play

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