如何使用 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);