gpt4 book ai didi

mongodb - 如何在 Mongo 聚合中合并文档中的数组字段

转载 作者:IT老高 更新时间:2023-10-28 13:14:43 26 4
gpt4 key购买 nike

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

第一条记录

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

第二次记录

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

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

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

我在 group 语句中尝试了 $addToset 但它给了我这样的标签:[["tag1","tag2"],["tag2","tag3"]]

您能帮我如何在聚合中实现这一目标

最佳答案

TLDR;

现代版本应使用 $reduce$setUnion在最初的 $group 之后如图:

db.collection.aggregate([
{ "$group": {
"_id": { "Host": "$Host", "ArtId": "$ArtId" },
"count": { "$sum": 1 },
"tags": { "$addToSet": "$tags" }
}},
{ "$addFields": {
"tags": {
"$reduce": {
"input": "$tags",
"initialValue": [],
"in": { "$setUnion": [ "$$value", "$$this" ] }
}
}
}}
])

您找到 $addToSet 是对的运算符,但在处理数组中的内容时,您通常需要使用 $unwind 进行处理第一的。这将数组条目“反规范化”,并实质上制作父文档的“副本”,其中每个数组条目作为字段中的奇异值。这就是您需要避免在不使用它的情况下看到的行为。

虽然您的“计数”提出了一个有趣的问题,但通过在初始 $group 之后使用“双重展开”很容易解决。操作:

db.collection.aggregate([
// Group on the compound key and get the occurrences first
{ "$group": {
"_id": { "Host": "$Host", "ArtId": "$ArtId" },
"tcount": { "$sum": 1 },
"ttags": { "$push": "$tags" }
}},

// Unwind twice because "ttags" is now an array of arrays
{ "$unwind": "$ttags" },
{ "$unwind": "$ttags" },

// Now use $addToSet to get the distinct values
{ "$group": {
"_id": "$_id",
"tcount": { "$first": "$tcount" },
"tags": { "$addToSet": "$ttags" }
}},

// Optionally $project to get the fields out of the _id key
{ "$project": {
"_id": 0,
"Host": "$_id.Host",
"ArtId": "$_id.ArtId",
"count": "$tcount",
"tags": "$ttags"
}}
])

最后一点是 $project也在那里,因为我在聚合管道的其他阶段为每个字段使用了“临时”名称。这是因为 $project 中有一个优化。即“复制”现有阶段中的字段,按照它们已经出现的顺序“在”任何"new"字段添加到文档中之前。

否则输出将如下所示:

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

字段的顺序与您想象的不同。确实微不足道,但对某些人来说很重要,因此值得解释为什么以及如何处理。

所以$unwind所做的工作是保持项目分开而不是在数组中,并执行 $group首先允许您获取“分组”键出现的“计数”。

$first运算符稍后使用“保留”该“计数”值,因为它只是为“标签”数组中存在的每个值“重复”。无论如何,这都是相同的值,所以没关系。随便挑一个。

关于mongodb - 如何在 Mongo 聚合中合并文档中的数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26904783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com