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

病毒

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

第一记录

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

$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即以“已存在”的顺序“复制”现有阶段中的字段,将其“出现在”任何“新”字段添加到文档之前。

否则输出将如下所示:

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

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

所以$unwind呢,以保持项目的工作分开,而不是在数组中,并做了$group第一个可以让你获得了“分组”键出现的“计数”。

$first以后使用运营商“保持”,即“计数”的值,因为它刚刚得到“复制”,每本的“标签”数组中值。无论如何,它们都是相同的值,所以没关系。选一个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Mongo DB中合并数组和文档字段

来自分类Dev

如何在Mongo DB中合并文档数组

来自分类Dev

合并 Mongo 文档中的字段

来自分类Dev

如何在Mongo聚合中折叠数组?

来自分类Dev

如何在mongo中更新文档子数组中的字段

来自分类Dev

在MongoDB聚合中合并数组字段

来自分类Dev

mongo聚合-一个数组中的字段也位于另一个数组中的文档数

来自分类Dev

如何在Mongodb中聚合不同的数组字段

来自分类Dev

如何在聚合中获取字段的值数组

来自分类Dev

如何在mongodb中查询文档以比较数组中的字段?

来自分类Dev

如何在mongo中查找不包含数组元素的文档

来自分类Dev

如何在项目位于数组中的地方返回mongo文档?

来自分类Dev

如何在mongo中过滤子数组并返回文档

来自分类Dev

如何在Spring Data Mongo中的聚合投影字段中嵌套字段

来自分类Dev

如何使用聚合在一个mongo文档中独立对多个数组进行排序

来自分类Dev

如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

来自分类Dev

如何访问mongo文档中的字段

来自分类Dev

如何在数组字段中对子文档进行排序?

来自分类Dev

如何使用聚合在MongoDB中合并/合并数组的数组?

来自分类Dev

如何在Mongoose中聚合嵌入式文档中的字段

来自分类Dev

基于非数组字段在mongo文档中投影数组值

来自分类Dev

如何将多个文档中的数组字段合并为 MongoDB 中的单个输出数组并将 mongoexport 合并为 csv

来自分类Dev

如何从聚合中的reduce或map中的文档字段声明变量?

来自分类Dev

如何在Mongo中合并列

来自分类Dev

如何从数组中的文档投影特定字段?

来自分类Dev

如何在弹性搜索中聚合数组中匹配的字段

来自分类Dev

如何让mongo返回字段中的数组?

来自分类Dev

如何在mongo的不同字段中获取具有价值的文档计数

来自分类Dev

如何在mongodb中的文档中获取数组字段中的特定数据?

Related 相关文章

  1. 1

    如何在Mongo DB中合并数组和文档字段

  2. 2

    如何在Mongo DB中合并文档数组

  3. 3

    合并 Mongo 文档中的字段

  4. 4

    如何在Mongo聚合中折叠数组?

  5. 5

    如何在mongo中更新文档子数组中的字段

  6. 6

    在MongoDB聚合中合并数组字段

  7. 7

    mongo聚合-一个数组中的字段也位于另一个数组中的文档数

  8. 8

    如何在Mongodb中聚合不同的数组字段

  9. 9

    如何在聚合中获取字段的值数组

  10. 10

    如何在mongodb中查询文档以比较数组中的字段?

  11. 11

    如何在mongo中查找不包含数组元素的文档

  12. 12

    如何在项目位于数组中的地方返回mongo文档?

  13. 13

    如何在mongo中过滤子数组并返回文档

  14. 14

    如何在Spring Data Mongo中的聚合投影字段中嵌套字段

  15. 15

    如何使用聚合在一个mongo文档中独立对多个数组进行排序

  16. 16

    如何在MongoDb中查找与数组中的字段和子文档字段匹配的文档

  17. 17

    如何访问mongo文档中的字段

  18. 18

    如何在数组字段中对子文档进行排序?

  19. 19

    如何使用聚合在MongoDB中合并/合并数组的数组?

  20. 20

    如何在Mongoose中聚合嵌入式文档中的字段

  21. 21

    基于非数组字段在mongo文档中投影数组值

  22. 22

    如何将多个文档中的数组字段合并为 MongoDB 中的单个输出数组并将 mongoexport 合并为 csv

  23. 23

    如何从聚合中的reduce或map中的文档字段声明变量?

  24. 24

    如何在Mongo中合并列

  25. 25

    如何从数组中的文档投影特定字段?

  26. 26

    如何在弹性搜索中聚合数组中匹配的字段

  27. 27

    如何让mongo返回字段中的数组?

  28. 28

    如何在mongo的不同字段中获取具有价值的文档计数

  29. 29

    如何在mongodb中的文档中获取数组字段中的特定数据?

热门标签

归档