【问题标题】:How to find Distinct Data in MongoRepository如何在 MongoRepository 中找到不同的数据
【发布时间】:2025-12-15 02:05:01
【问题描述】:

如何为 Mongo DB 编写自定义查询以获取不同的数据需要用 Java 编写,但我需要检查是否也可以在不使用聚合管道的情况下使用查询。 样本数据:

[
   {
      "id":1,
      "empName":"emp1",
      "emp_city":"city1"
   },
   {
      "id":2,
      "empName":"emp2",
      "emp_city":"city1"
   },
   {
      "id":3,
      "empName":"emp1",
      "emp_city":"city1"
   },
   {
      "id":4,
      "empName":"emp1",
      "emp_city":"city2"
   }
]

预期输出:

[
   {
      "empName":"emp1",
      "emp_city":"city1"
   },
   {
      "empName":"emp1",
      "emp_city":"city2"
   },
   {
      "empName":"emp2",
      "emp_city":"city1"
   }
]

【问题讨论】:

    标签: java mongodb jpa mongodb-query


    【解决方案1】:

    对于您要归档的内容,我建议您使用分组依据,按两个字段(empName 和 emp_city),

    这里有例子https://sqlserverguides.com/mongodb-group-by-multiple-fields/

    【讨论】:

    • 我不想使用聚合方式,这是mongo模板的方式但是我需要使用mongo仓库。那么是否可以在不使用聚合的情况下编写查询?
    • 好的,那么这是使用聚合而不是 find() 方法来实现相同结果的多个字段不同的唯一方法吗?与一个字段不同,但上面示例中的响应也很好。但是当我使用预定义的方法时,返回类型是 List 所以需要使用自定义查询编写,但我不想使用 mongo 模板的聚合方法
    • 你想要什么和你有什么是两个不同的东西,最简单和更易于维护的方法是使用聚合,我假设你有这两个字段并通过索引。如果您逐个字段执行不同的字段,您将生成错误的结果,因为您可能最终得到每组的笛卡尔积。如果我没记错的话,MongoTemplate 还根据版本承认自定义返回类型。您始终可以从字符串转换为您的值。 distinct 的唯一其他版本将使用分隔符连接字段,然后是 distinct,然后通过 concat 键拆分结果
    • 我们可以通过@Query注解在不使用mongo模板方法的情况下使用spring-data吗?对 mongo 存储库使用任何方法而不是 mongo 模板。
    【解决方案2】:

    使用这个:

    db.collection.aggregate([
      {
        $group: {
          _id: {
            empName: "$empName",
            emp_city: "$emp_city"
          }
        }
      },
      {
        "$replaceRoot": {
          "newRoot": "$_id"
        }
      }
    ])
    

    https://mongoplayground.net/p/d8i7iOuvfsR

    【讨论】:

    • 我不想使用聚合方式,这是mongo模板的方式但是我需要使用mongo仓库。那么是否可以在不使用聚合的情况下编写查询?
    最近更新 更多