首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >聚合$accumulator + $project

聚合$accumulator + $project
EN

Stack Overflow用户
提问于 2022-09-28 18:50:18
回答 1查看 41关注 0票数 2

目前,我在MongoDB中有很多文档。我需要做的是找到每个唯一的字段、键和值,并计算每个字段存在的总量。例如,如果我们有这些文件:

代码语言:javascript
运行
复制
[{ value1: 'same', value2: 'unique'}, { value1: 'same', value2: 'unique1' }, { value3: 'new' }] 

输出应该是(类似于此的东西--确切的格式并不重要)

代码语言:javascript
运行
复制
[
    {
        value1: { 
            same: 2, // there are 2 documents with { value1: 'same' }
        },
        value2: {
            unique: 1, // there is 1 document with { value2: 'unique' }
            unique1: 1, // there is 1 document with { value2: 'unique1' }
        },
        value3: {
            new: 1, // there is 1 document with { value3: 'new' }
        },
    }
]

我不确定用聚合(我们可以对所有属性进行“解压”,但这将为每个属性创建一个新文档,然后遍历每个属性,这对性能非常不利)是否有一个好的、可执行的方法)。

我有两种方法看起来很接近于获得一个总体的想法,但我对这两种方法都有异议。

  1. $function +全局变量

如果我可以遍历每个文档并使用全局"output“变量,我可以简单地为每个文档更新这个变量,在JS中完成工作,然后在最后返回变量。

我尝试做的“概念证明”就是简单地增加一个全局变量,然后将这个变量作为文档返回。

代码语言:javascript
运行
复制
[{
    // write a custom JS function that has access to the current document
    $replaceRoot: {
        newRoot: {
            $function: {
                body: function (doc: any, TOTAL_COUNT: any) {
                    if (!TOTAL_COUNT) TOTAL_COUNT = 0; // set the initial value
                    TOTAL_COUNT++; // this doesn't truly increment the "$TOTAL_COUNT" variable :(
                    return { total_count: TOTAL_COUNT };
                },
                args: ['$$ROOT', '$TOTAL_COUNT'],
                lang: 'js',
            },
        },
    },
},
]
  1. 累加器

我很确定使用累加器(因为这些是用来存储持久信息的)来实现这一点的“正确”方法。但是,累加器唯一可用的方法是$group、$bucket和$bucketAuto。

据我所知,所有这些都不允许我简单地“返回一个输出”,类似于$project或$replaceRoot。

我很乐意使用累加器或函数,一旦我有了概念工作的证据,我就自己做剩下的事情:)

谢谢你的帮助/建议!非常感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-28 20:04:18

您可以首先将文档转换为k-v元组数组。根据需要$unwind数组和$group

代码语言:javascript
运行
复制
db.collection.aggregate([
  {
    "$project": {
      kv: {
        "$objectToArray": "$$ROOT"
      }
    }
  },
  {
    "$unwind": "$kv"
  },
  {
    "$match": {
      "kv.k": {
        $ne: "_id"
      }
    }
  },
  {
    $group: {
      _id: {
        k: "$kv.k",
        v: "$kv.v"
      },
      cnt: {
        $sum: 1
      }
    }
  }
])

这是供您参考的蒙戈游乐场

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73886502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档