Spring Mongo Db 中按文档数组分组

问题描述 投票:0回答:1

如何在 Spring 和 MongoDb 中按

tagValu
e 进行分组? MongoDB 查询:

db.feed.aggregate([                 
    { $group: { _id: "$feedTag.tagValue", number: { $sum : 1 } } },
    { $sort: { _id : 1 } }        
])

我如何在 Spring MongoDB 中做同样的事情,可能使用聚合方法? Feed 集合的示例文档:

{
    "_id" : ObjectId("556846dd1df42d5d579362fd"),   
    "feedTag" : [ 
        {
            "tagName" : "sentiment",
            "tagValue" : "neutral",
            "modelName" : "sentiment"
        }
    ],    
    "createdDate" : "2015-05-28"
}
mongodb aggregation-framework spring-data-mongodb database
1个回答
2
投票

要按

tagValue
进行分组,由于这是一个数组字段,因此您需要在分组之前应用
$unwind
管道步骤来拆分数组,以便获得实际计数:

db.feed.aggregate([  
    {'$unwind': '$feedTag'},
    {'$group': { 
        '_id': '$feedTag.tagValue', 
        'number': { '$sum' : 1 } 
    }},
    {'$sort': { '_id' : 1 }}        
])

以下是Spring Data MongoDB中的等效示例:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

Aggregation agg = newAggregation(    
    unwind("feedTag"),
    group("feedTag.tagValue").count().as("number"),    
    sort(ASC, "_id") 
);

// Convert the aggregation result into a List
AggregationResults<Feed> results = mongoTemplate.aggregate(agg, "feed", Feed.class);
List<Feed> feedCount = results.getMappedResults();

根据上面的内容,通过

newAggregation
静态工厂方法创建了一个新的聚合对象,该方法传递了定义聚合的聚合管道的聚合操作列表。

第一步使用展开操作为“feedTag”数组中的每个标签生成一个新文档。

在第二步中,组操作为每个嵌入的

"feedTag.tagValue"
值定义一个组,通过计数聚合运算符聚合该组的出现计数。

第三步,通过排序操作按

feedTag
的升序对
tagValue
的结果列表进行排序。

最后调用MongoTemplate上的aggregate方法,让MongoDB以创建的Aggregation为参数执行实际的聚合操作。

请注意,输入集合被显式指定为聚合方法的

"feed"
参数。如果未显式指定输入集合的名称,则它派生自作为第一个参数传递给 newAggreation 方法的输入类。

© www.soinside.com 2019 - 2024. All rights reserved.