如何使用 Spring Mongo 对两个字段进行分组并根据另一个字段获取一个字段的数组?
How do I use Spring Mongo to group two fields and get a array of one fields based on the other?
这里举个例子:
collection 作者中的两个条目:
{
"name" : "Joe"
"Book" : "A"
},
{
"name" : "Joe"
"Book" : "B"
}
现在,如果我通过 spring mongo 使用 Mongo 中的聚合函数,基本上只是为了获取名为 Joe 的书籍,它可以编码为:
Aggregation agg = newAggregation(Map.class, group("name", "Book"));
AggregationResults<Map> results = mongoTemplate.aggregate(agg, "Author",
Map.class);
显然我可以通过这种方式获得两张地图,一张有条目 {"name":"Joe", "Book": A}
,另一张有 {"name" : "Joe", "Book" : "B"}
但是如果我只想得到一个结果,一个条目怎么办:
{"name" : Joe, "Books" : ["A", "B"]}?
我不确定仅使用一个查询是否可以到达它。它当然可以通过多个步骤来实现,我不想这样做。
您需要对一组文档中的每个文档使用 $addToSet
operator in your $group
pipeline. This will return an array of all unique values ["A", "B"]
that results from applying the $group
表达式,这些文档按键 "name"
共享同一组。所以在 mongo shell 你有
db.author.aggregate([
{ $group: {
_id: '$name',
Books: { $addToSet: '$Book' }
} }
]);
返回想要的结果
{
"result" : [
{
"_id" : "Joe",
"Books" : [ "B", "A" ]
}
],
"ok" : 1
}
相当于Spring聚合:
Aggregation agg = newAggregation(Map.class, group("name").addToSet("Book").as("Books"));
AggregationResults<Map> results = mongoTemplate.aggregate(agg, "Author", Map.class);
这里举个例子:
collection 作者中的两个条目:
{
"name" : "Joe"
"Book" : "A"
},
{
"name" : "Joe"
"Book" : "B"
}
现在,如果我通过 spring mongo 使用 Mongo 中的聚合函数,基本上只是为了获取名为 Joe 的书籍,它可以编码为:
Aggregation agg = newAggregation(Map.class, group("name", "Book"));
AggregationResults<Map> results = mongoTemplate.aggregate(agg, "Author",
Map.class);
显然我可以通过这种方式获得两张地图,一张有条目 {"name":"Joe", "Book": A}
,另一张有 {"name" : "Joe", "Book" : "B"}
但是如果我只想得到一个结果,一个条目怎么办:
{"name" : Joe, "Books" : ["A", "B"]}?
我不确定仅使用一个查询是否可以到达它。它当然可以通过多个步骤来实现,我不想这样做。
您需要对一组文档中的每个文档使用 $addToSet
operator in your $group
pipeline. This will return an array of all unique values ["A", "B"]
that results from applying the $group
表达式,这些文档按键 "name"
共享同一组。所以在 mongo shell 你有
db.author.aggregate([
{ $group: {
_id: '$name',
Books: { $addToSet: '$Book' }
} }
]);
返回想要的结果
{
"result" : [
{
"_id" : "Joe",
"Books" : [ "B", "A" ]
}
],
"ok" : 1
}
相当于Spring聚合:
Aggregation agg = newAggregation(Map.class, group("name").addToSet("Book").as("Books"));
AggregationResults<Map> results = mongoTemplate.aggregate(agg, "Author", Map.class);