使用mongo聚合合并文档中的数组

时间:2014-11-13 10:28:23

标签: java mongodb aggregation-framework

我有一个要求,我需要在两个记录上进行聚合,这两个记录都有两个具有不同值的数组字段。我需要的是当我对这些记录进行聚合时,结果应该有一个数组,其中包含来自不同数组的唯一值。这是一个例子:

第一条记录

 { Host:"abc.com" ArtId:"123", tags:[ "tag1", "tag2" ], msg:["msg1", "msg2"] }

第二条记录

{ Host:"abc.com" ArtId:"123", tags:[ "tag2", "tag3" ], msg:["msg2", "msg3"]  }

在主机和artid上聚合后,我需要这样的结果:

 { Host: "abc.com", ArtId: "123", count :"2", tags:[ "tag1", "tag2", "tag3" ],msg:["msg1","msg2", "msg3"] }

我在群组声明中尝试了$addToset,但它给了我这样的标记:[["tag1","tag2"],["tag2","tag3"]] msg:[["msg1","msg2"],["msg2","msg3"]]

你能帮我解决一下如何在聚合中实现这一点,或者我应该使用代码来解析我的java代码中的数组,以便从嵌套数组中创建单个数组,因为我认为对于两个数组字段我需要多次进行聚合

1 个答案:

答案 0 :(得分:1)

您可以先使用$unwind

解决此问题

所以

db.collection.aggregate([...,
                         {$unwind:"$tags"},
                         {$unwind:"$msg"},
                         {$group: { ..., tags:{ $addToSet: "$tags" },
                                         msg:{ $addToSet: "$msg" },...}},
                         ...])

作为解释:$addToSet根据您输入的唯一值创建一个数组。在你的情况下,这些是数组,因此它构建了一个数组数组。

$unwind运算符通过为该数组中的每个值创建文档的重复项来展开数组,该数组仅包含该值而不包含该数组(例如tags:tag1)。因此$addToSet获取单个值而不是数组以构建新数组。