【问题标题】:Spring mongo: Query Subdocument array to get matching subdocuments using IN clauseSpring mongodb:使用IN子句查询子文档数组以获取匹配的子文档
【发布时间】:2020-10-26 18:27:23
【问题描述】:

您好,收藏如下:

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 的字段参数中使用prefs.$: 1,但它只返回第一个匹配的子文档。

期望的输出

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

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

【问题讨论】:

  • 如果你找到更好的方法,你能把它贴出来吗?如果以下答案有帮助,您可以投票/批准吗?

标签: mongodb mongodb-query


【解决方案1】:

你需要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"
      }
    }
  }
])

【讨论】:

  • 我需要在结果中与我在 find 的 "$in" 子句中传递的 "name" 字段匹配的多个子文档。我尝试过您已经提到的投影,但它只是给了我在文档中找到的“名称”的第一个匹配子文档。
  • 如果我删除了展开聚合器,它仍然会给我所有的子文档。第二种解决方案也没有给出我想要的结果。我想要父级中的子文档数组而不像这样展开它 { "_id": ObjectId("5a934e000102030405000000"), "clntId": 1234, "clntType": "internal", "prefs": [ { "name": " AAA", "value": "value1" }, { "name": "CCC", "value": "value3" } ] }
  • 不放松是不可能的。您需要使用聚合框架来获得它。但这会导致您进入更多的管道阶段。这就像你不能仅仅因为你不需要就跳过字母表中的 p、q、r。聚合框架中可能有另一种方式,但它会带您进入相同数量或更多数量的管道阶段。
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
相关资源
最近更新 更多