【问题标题】:How to convert this query using Spring Mongodb Aggregation apis?如何使用 Spring Mongodb Aggregation apis 转换此查询?
【发布时间】:2013-09-11 19:25:13
【问题描述】:

这是我要执行的查询:

db['applications'].aggregate(
 {$project: {key:1, _id:0}}
 ,{$group: { _id:null, keyList: {$addToSet:"$key"}}} );

这是我正在使用的代码:

 Aggregation agg = newAggregation(
            project("key"),
            group("key").addToSet("key").as("keylist")
    );

但是,产生的结果是这样的:

Executing aggregation: 
{ "aggregate" : "applications" , "
  pipeline" : [ 
 { "$project" : { "key" : "$key"}} , 
 { "$group" : { "_id" : "$key" , "keylist" : { "$addToSet" : "$key"}}}
]}

为什么组中的_id键设置为'group'的参数。如何使其为空?
如何让 Spring MongoData 生成我想要的查询?

【问题讨论】:

  • 仅供参考:这与您的问题没有直接关系,但您不需要在 $group 之前明确添加 $project 阶段。 MongoDB 将自动确定源文档中需要哪些字段并仅提取这些字段。 (我是聚合框架的主要开发者)
  • 只是出于好奇,这对我的回答有帮助吗?

标签: spring mongodb spring-data spring-data-mongodb


【解决方案1】:

不幸的是,对于小组阶段,您不能通过空值查看documentation

public static GroupOperation group(String... fields)
Creates a new GroupOperation for the given fields.
Parameters:
fields - must not be null.
Returns:

但是,您可以通过为集合中不存在的组 ID 选择字段名称来实现相同的目的。不漂亮,但应该可以。

Aggregation agg = newAggregation(
            project("key"),
            group("ANYSTRINGWHICHISNOTFIELDNAME").addToSet("key").as("keylist")
    );

您不必关心项目阶段,管道中的数据越少越好,但结果将是相同的。

【讨论】:

  • 没有使用 spring data mongo 1.10.8.RELEASE,所以使用空 group() 代替
【解决方案2】:

您可以使用采用String... 的方法并简单地输入不带参数的管道:

group().addToSet("key").as("keylist")

在当前发布的版本中,它呈现为:

$group: { _id : {}, keyList : { $addToSet : "$key" }}

虽然这不是 100% 符合文档,但它与 _id : null 的作用相同。我们已经提交并修复了DATAMONGO-759,它将在 Spring Data Commons 的 1.3.2 和 1.4 M1 中发布。

【讨论】:

    【解决方案3】:

    从当前版本的 Spring Data MongoDB 开始,如果不指定参数进行分组,它将按 null 分组。

    Aggregation agg = newAggregation(
                project("key"),
                group().addToSet("key").as("keylist")
        );
    

    【讨论】:

      【解决方案4】:

      对我没用,但起作用的是在你的集合中声明这样的虚拟属性:

      Class Model{
      ...
      ...
      private Integer dummyNotExistsProp
      }
      

      然后这是没有匹配和投影的愚蠢查询,只是为了演示问题的解决方案:

      Aggregation agg = Aggregation.newAggregation(
                      Aggregation.match(Aggregation.group("dummyNotExistsProp").count().as("totalobjs"));
      

      【讨论】:

        猜你喜欢
        • 2015-12-17
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多