我有一个要求,我需要在两个记录上进行聚合,这两个记录都有两个具有不同值的数组字段。我需要的是当我对这些记录进行聚合时,结果应该有一个数组,其中包含来自不同数组的唯一值。这是一个例子:
第一条记录
{ 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代码中的数组,以便从嵌套数组中创建单个数组,因为我认为对于两个数组字段我需要多次进行聚合
答案 0 :(得分:1)
您可以先使用$unwind
所以
db.collection.aggregate([...,
{$unwind:"$tags"},
{$unwind:"$msg"},
{$group: { ..., tags:{ $addToSet: "$tags" },
msg:{ $addToSet: "$msg" },...}},
...])
作为解释:$addToSet
根据您输入的唯一值创建一个数组。在你的情况下,这些是数组,因此它构建了一个数组数组。
$unwind
运算符通过为该数组中的每个值创建文档的重复项来展开数组,该数组仅包含该值而不包含该数组(例如tags:tag1
)。因此$addToSet
获取单个值而不是数组以构建新数组。