Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB聚合和在Spring数据上实现_Mongodb_Mapreduce_Spring Data_Aggregation Framework_Spring Mongodb - Fatal编程技术网

MongoDB聚合和在Spring数据上实现

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" } } },

HOUR_COUNTS集合包含{docId,HOUR,count}

通过使用以下mongodb查询,我很容易获得docId计数的总和:

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
下。