大家好,我有一个大问题在查询我的数据。我有这样的文件:
{
"_id" : NumberLong(999789748357864),
"text" : "#asd #weila #asd2 welcome in my house",
"date" : ISODate("2016-12-13T21:44:37.000Z"),
"dateString" : "2016-12-13",
"hashtags" : [
"asd",
"weila",
"asd2"
]
}
我想构建两个查询:
1)每天计算标签的数量,然后输出,例如,如下所示:
{_id:"2016-12-13",
hashtags:[
{hashtag:"asd",count:20},
{hashtag:"weila",count:18},
{hashtag:"asd2",count:10},
....
]
}
{_id:"2016-12-14",
hashtags:[
{hashtag:"asd",count:18},
{hashtag:"asd2",count:14},
{hashtag:"weila",count:10},
....
]
}
2)另一个是相同的,但我想设置一个期间从2016-12-13到2016-12-17。
对于第一个查询,我编写了这个查询,并得到了我所搜索的内容,但是在Spring Data Mongo中,我不知道如何编写。
db.comment.aggregate([
{$unwind:"$hashtags"},
{"$group":{
"_id":{
"date" : "$dateString",
"hashtag": "$hashtags"
},
"count":{"$sum":1}
}
},
{"$group":{
"_id": "$_id.date",
"hashtags": {
"$push": {
"hashtag": "$_id.hashtag",
"count": "$count"
}},
"count": { "$sum": "$count" }
}},
{"$sort": { count: -1}},
{"$unwind": "$hashtags"},
{"$sort": { "count": -1, "hashtags.count": -1}},
{"$group": {
"_id": "$_id",
"hashtags": { "$push": "$hashtags" },
"count": { "$first": "$count" }
}},
{$project:{name:1,hashtags: { $slice: ["$hashtags", 2 ]}}}
]);
var startDate = new Date("2016-12-13");
startDate.setHours(0,0,0,0);
var endDate = new Date("2016-12-14");
endDate.setHours(23,59,59,999);
var pipeline = [
{
"$match": {
"date": { "$gte": startDate, "$lte": endDate }
}
}
{ "$unwind": "$hashtags" },
{
"$group": {
"_id": {
"date": "$dateString",
"hashtag": "$hashtags"
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"hashtags": {
"$push": {
"hashtag": "$_id.hashtag",
"count": "$count"
}
}
}
}
]
db.comment.aggregate(pipeline)
var startDate = new Date("2016-12-13");
startDate.setHours(0,0,0,0);
var endDate = new Date("2016-12-17");
endDate.setHours(23,59,59,999);
// run the same pipeline as above but with the date range query set as required
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation agg = newAggregation(
match(Criteria.where("date").gte(startDate).lte(endDate)),
unwind("hashtags"),
group("dateString", "hashtags").count().as("count"),
group("_id.dateString")
.push(new BasicDBObject
("hashtag", "$_id.hashtags").append
("count", "$count")
).as("hashtags")
);
AggregationResults<Comment> results = mongoTemplate.aggregate(agg, Comment.class);
List<Comment> comments = results.getMappedResults();
问题内容: 这是我第一次在Java中使用Mongo,并且此聚合查询存在一些问题。我可以在Mongo for Spring中执行一些简单的查询,并在我的Repository接口中扩展注解。知道在Spring-Data中进行长时间聚合时采用哪种方法会很有帮助。 问题答案: 您可以实现AggregationOperation 并编写自定义聚合操作查询,然后用于执行您在mongo shell中执行的任何m
这是我第一次在Java中使用Mongo,这个聚合查询有一些问题。我可以在我的存储库界面中使用注释在Mongo for Spring中进行一些简单的查询,这扩展了
原因:org.bson.codecs.configuration.codecConfigurationException:找不到java.time.LocalDateTime类的编解码器。 使用下面的代码 您将在这里找到很少的测试,LocalDateTime可以很好地使用Spring存储库,这是使用MongoTemplate使用Criteria API的经典查询,但在创建聚合查询时会引发此错误。h
我有一个在MongoDB Shell中工作的查询,但是当我增加要返回的文档数量时,它使用Spring Data MongoDB抛出聚合结果超过最大文档大小(16MB)异常。 以下是返回无误的shell查询: 以下是Spring数据片段: 当我限制在100或1000条记录时,一切正常。当我增加到10000时,会出现“聚合结果超过最大文档大小(16MB)”异常。 以下是我使用的版本供参考: 更新: 背
我不熟悉Mongo中的聚合查询,并且一直在努力产生我想要的输出。我有以下聚合查询: 返回以下结果: 如何修改聚合查询,以便只返回2个文档而不是3个文档?将两个“ABC-123”结果合并为一个结果,并使用带有“bu”和“count”字段的新计数数组,即。 非常感谢
是否有其他选择-或者使用mongoTemplate是最好的选择? 谢谢