如何使用Spring Mongo对两个字段进行分组并根据另一个字段获取一个字段的数组?

时间:2015-04-28 06:33:28

标签: spring mongodb mongodb-query aggregation-framework

让我举一个例子:

集合中的两个条目作者:

{
"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"]}?

我不确定是否只使用一个查询就可以访问它。它当然可以通过我不想做的多个步骤来实现。

1 个答案:

答案 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);