首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring中文档数组的分组

Spring中文档数组的分组
EN

Stack Overflow用户
提问于 2015-07-30 09:44:43
回答 1查看 2.2K关注 0票数 2

我如何在春季和MongoDb中按MongoDb e分组?MongoDB查询:

代码语言:javascript
复制
db.feed.aggregate([                 
    { $group: { _id: "$feedTag.tagValue", number: { $sum : 1 } } },
    { $sort: { _id : 1 } }        
])

我如何在Spring MongoDB中做同样的事情,可能使用聚合方法?饲料收集样本文件:

代码语言:javascript
复制
{
    "_id" : ObjectId("556846dd1df42d5d579362fd"),   
    "feedTag" : [ 
        {
            "tagName" : "sentiment",
            "tagValue" : "neutral",
            "modelName" : "sentiment"
        }
    ],    
    "createdDate" : "2015-05-28"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 10:09:40

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

代码语言:javascript
复制
db.feed.aggregate([  
    {
        "$unwind": "$feedTag"
    }
    { 
        "$group": { 
            "_id": "$feedTag.tagValue", 
            "number": { "$sum" : 1 } 
        } 
    },
    { "$sort": { "_id" : 1 } }        
])

以下是弹簧数据MongoDB中的等效示例

代码语言:javascript
复制
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"-value定义一个组,其发生计数通过计数聚合操作符进行聚合。

作为第三步,通过排序操作将feedTag的结果列表按其tagValue的升序排序。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31720338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档