当前位置: 首页 > 知识库问答 >
问题:

mongo和spring-data-mongo中的聚合查询

娄利
2023-03-14

大家好,我有一个大问题在查询我的数据。我有这样的文件:

{
    "_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 ]}}}
]);

共有1个答案

督俊雅
2023-03-14
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是最好的选择? 谢谢