让我举一个例子:
集合中的两个条目作者:
{
"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"]}?
我不确定是否只使用一个查询就可以访问它。它当然可以通过我不想做的多个步骤来实现。
答案 0 :(得分:2)
您需要在$addToSet
管道中使用$group
运算符。这将返回一个包含所有唯一值["A", "B"]
的数组,这些值是将$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);