如何使用Spring Mongodb Aggregation apis转换此查询?

时间:2013-09-11 19:25:14

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

这是我想要执行的查询:

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生成我想要的查询?

4 个答案:

答案 0 :(得分:4)

不幸的是,对于小组阶段,你不能传递null看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")
    );

您不必关心项目阶段,在管道中使用较小的数据是好的,但结果将是这样的。

答案 1 :(得分:4)

您可以使用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中发布。

答案 2 :(得分:1)

从当前版本的Spring Data MongoDB开始,如果您没有指定要分组的参数,它将按null分组。

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

答案 3 :(得分:0)

没有为我工作,但是在你收集虚拟财产中宣布的工作是什么:

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

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

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