按 Spring Mongo Db 中的文档数组分组
Group by array of document in Spring Mongo Db
如何在 Spring 和 MongoDb 中按 tagValu
e 分组?
MongoDB 查询:
db.feed.aggregate([
{ $group: { _id: "$feedTag.tagValue", number: { $sum : 1 } } },
{ $sort: { _id : 1 } }
])
如何在 Spring MongoDB 中做同样的事情,可能正在使用聚合方法?
提要集合的示例文档:
{
"_id" : ObjectId("556846dd1df42d5d579362fd"),
"feedTag" : [
{
"tagName" : "sentiment",
"tagValue" : "neutral",
"modelName" : "sentiment"
}
],
"createdDate" : "2015-05-28"
}
要按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 上的聚合方法,让 MongoDB 以创建的聚合作为参数执行实际的聚合操作。
请注意,输入集合明确指定为聚合方法的 "feed"
参数。如果未明确指定输入集合的名称,则其派生自作为第一个参数传递给 newAggreation 方法的 input-class。
如何在 Spring 和 MongoDb 中按 tagValu
e 分组?
MongoDB 查询:
db.feed.aggregate([
{ $group: { _id: "$feedTag.tagValue", number: { $sum : 1 } } },
{ $sort: { _id : 1 } }
])
如何在 Spring MongoDB 中做同样的事情,可能正在使用聚合方法? 提要集合的示例文档:
{
"_id" : ObjectId("556846dd1df42d5d579362fd"),
"feedTag" : [
{
"tagName" : "sentiment",
"tagValue" : "neutral",
"modelName" : "sentiment"
}
],
"createdDate" : "2015-05-28"
}
要按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 上的聚合方法,让 MongoDB 以创建的聚合作为参数执行实际的聚合操作。
请注意,输入集合明确指定为聚合方法的 "feed"
参数。如果未明确指定输入集合的名称,则其派生自作为第一个参数传递给 newAggreation 方法的 input-class。