2

这是我要执行的查询:

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 键设置为“组”的参数。我如何使它为空?
如何让 Spring MongoData 生成我想要的查询?

4

4 回答 4

4

不幸的是,对于小组阶段,您不能通过 null 查看文档

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")
    );

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

于 2013-09-15T21:04:09.100 回答
4

您可以使用采用 a 的方法,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 中发布。

于 2013-09-30T17:45:24.743 回答
1

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

Aggregation agg = newAggregation(
            project("key"),
            group().addToSet("key").as("keylist")
    );
于 2017-06-21T10:40:19.590 回答
0

没有为我工作,但有效的是在你的集合中声明这样的虚拟属性:

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

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

Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(Aggregation.group("dummyNotExistsProp").count().as("totalobjs"));
于 2015-08-06T14:16:16.957 回答