MongoDB聚合和在Spring数据上实现
HOUR_COUNTS集合包含{docId,HOUR,count} 通过使用以下mongodb查询,我很容易获得docId计数的总和:MongoDB聚合和在Spring数据上实现,mongodb,mapreduce,spring-data,aggregation-framework,spring-mongodb,Mongodb,Mapreduce,Spring Data,Aggregation Framework,Spring Mongodb,HOUR_COUNTS集合包含{docId,HOUR,count} 通过使用以下mongodb查询,我很容易获得docId计数的总和: db.HOUR_COUNTS.aggregate( [ { $match: { hour: { $gte: 10 } } }, { $group: { _id: "$docId", total: { $sum: "$count" } } },
db.HOUR_COUNTS.aggregate(
[
{
$match: { hour: { $gte: 10 } }
},
{
$group: { _id: "$docId", total: { $sum: "$count" } }
},
{
$sort: { total: -1, _id: -1 }
},
{
$limit: 20
}
]
)
然后我可以得到以下结果:
{ "_id" : 6831, "total" : 6 }
{ "_id" : 6830, "total" : 6 }
{ "_id" : 6849, "total" : 4 }
{ "_id" : 6848, "total" : 4 }
{ "_id" : 6847, "total" : 3 }
现在是我使用Spring数据的时候了
我尝试过这样做,但不起作用:
Aggregation agg = newAggregation(
match(where("hour").gte(0)),
project("docId"),
group("docId").sum("count").as("total"),
project("total").and("docId").previousOperation(),
sort(Sort.Direction.DESC, "total", "docId"),
limit(20)
);
错误是:
java.lang.IllegalArgumentException: Invalid reference 'count'!
因此,我想知道如何在Spring数据上进行查询。谢谢。为什么这会起作用?这是你真正应该问自己的问题 在聚合管道操作中,运算符(例如且仅“返回”您显式要求它们返回的字段)。作为一个“管道”概念,只有上一管道阶段的“输出”可用于下一阶段和之后的阶段,除非可能再次修改 因此,您在Java代码中编写的内容与您在shell中进行的实验并不相同。您尝试引用先前的
$project
操作排除的“字段”。所以不要那样做。您似乎对聚合管道中的实际优化方式有错误的看法:
Aggregation agg=newAggregation(
匹配(标准,其中“小时”).gte(10)),
集团(“docId”)。总额(“计数”)为(“总计”),
排序(sort.Direction.DESC,“总计”、“文档ID”),
限额(20)
);
这和你之前写的是一样的。您不需要额外的“项目”操作,它们对您的预期结果有害。谢谢。我曾尝试过这样做,但不幸的是,它显示了所有docId=0,总数是正确的,但无法显示docIdoh great。我更改了名为HourCountResult的输出模型。以前的变量包括{docId,total},然后我改为{id,total},这样它就可以工作了。但是,有任何方法可以继续使用docId而不是id。谢谢。@fmchan
$group
管道阶段使用\u id
作为强制分组键。您可以始终在管道“末端”的$project
处忽略\u id
,并将内容放在docId
下。