按照Spring Mongo Db中的文档数组进行分组

时间:2015-07-30 09:44:43

标签: mongodb aggregation-framework spring-data-mongodb database

如何在Spring和MongoDb中按tagValu e分组? MongoDB查询:

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

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

{
    "_id" : ObjectId("556846dd1df42d5d579362fd"),   
    "feedTag" : [ 
        {
            "tagName" : "sentiment",
            "tagValue" : "neutral",
            "modelName" : "sentiment"
        }
    ],    
    "createdDate" : "2015-05-28"
}

1 个答案:

答案 0 :(得分:1)

要按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 静态工厂方法创建一个新的聚合对象,该方法传递了一个聚合操作列表,用于定义聚合的聚合管道。

第四步使用展开操作为&#34; feedTag&#34;中的每个标签生成一个新文档。阵列。

在第二步中,组操作为每个嵌入的"feedTag.tagValue"定义一个组 - 通过计数聚合运算符聚合出现计数的值。

第三步,通过排序操作按升序 feedTag tagValue 对结果列表进行排序。

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

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