这是我想要执行的查询:
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生成我想要的查询?
答案 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"));