MongoDB 聚合不同文档中两个数组中的项目计数?

2024-03-16

这是我的 MongoDB 集合架构:

company: String
model: String
cons: [String] // array of tags that were marked as "cons"
pros: [String] // array of tags that were marked as "pros"

我需要聚合它,以便得到以下输出:

[{
  "_id": {
    "company": "Lenovo",
    "model": "T400"
  },
  "tags": {
    tag: "SomeTag"
    pros: 124 // number of times, "SomeTag" tag was found in "pros" array in `Lenovo T400`
    cons: 345 // number of times, "SomeTag" tag was found in "cons" array in `Lenovo T400`
  }
}...]

我尝试执行以下操作:

var aggParams = {};
aggParams.push({ $unwind: '$cons' });
aggParams.push({ $unwind: '$pros' });
aggParams.push({$group: {
  _id: {
    company: '$company',
    model: '$model',
    consTag: '$cons'
  },
  consTagCount: { $sum: 1 }
}});
aggParams.push({$group: {
  _id: {
    company: '$_id.company',
    model: '$_id.model',
    prosTag: '$pros'
  },
  prosTagCount: { $sum: 1 }
}});
aggParams.push({$group: {
  _id: {
    company:'$_id.company',
    model: '$_id.model'
  },
  tags: { $push: { tag: { $or: ['$_id.consTag', '$_id.prosTag'] }, cons: '$consTagCount', pros: '$prosTagCount'} }
}});

但我得到了以下结果:

{
  "_id": {
    "company": "Lenovo",
    "model": "T400"
  },
  "tags": [
    {
      "tag": false,
      "pros": 7
    }
  ]
}

执行此操作的正确方法是什么aggregation?


是的,考虑到有多个数组,这有点困难,如果您同时尝试两个数组,您最终会得到“笛卡尔条件”,其中一个数组乘以另一个数组的内容。

因此,只需在开头组合数组内容,这可能表明您应该如何首先存储数据:

Model.aggregate(
    [
        { "$project": {
            "company": 1,
            "model": 1,
            "data": {
                "$setUnion": [
                    { "$map": {
                        "input": "$pros",
                        "as": "pro",
                        "in": {
                            "type": { "$literal": "pro" },
                            "value": "$$pro"
                        }
                    }},
                    { "$map": {
                        "input": "$cons",
                        "as": "con",
                        "in": {
                            "type": { "$literal": "con" },
                            "value": "$$con"
                        }
                    }}
                ]
            }
        }},
        { "$unwind": "$data" }
        { "$group": {
            "_id": { 
                "company": "$company",
                "model": "$model",
                "tag": "$data.value"
            },
            "pros": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$data.type", "pro" ] },
                        1,
                        0
                    ]
                }
            },
            "cons": { 
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$data.type", "con" ] },
                        1,
                        0
                    ]
                }
            }
        }
    ], 
    function(err,result) {

    }
)

索非亚第一$project http://docs.mongodb.org/master/reference/operator/aggregation/project/上演$map http://docs.mongodb.org/master/reference/operator/aggregation/map/运算符将“type”值添加到每个数组的每个项目。这并不是说它真的很重要,因为无论如何所有项目都应该处理“唯一”,$setUnion http://docs.mongodb.org/master/reference/operator/aggregation/setUnion/运算符将每个数组“连接”为单个数组。

如前所述,您可能应该首先以这种方式存储。

然后处理$unwind http://docs.mongodb.org/master/reference/operator/aggregation/unwind/其次是$group http://docs.mongodb.org/master/reference/operator/aggregation/group/,其中每个“优点”和“缺点”然后通过评估$cond http://docs.mongodb.org/master/reference/operator/aggregation/cond/为它匹配的“类型”,要么返回1 or 0比赛分别在哪里true/false to the $sum http://docs.mongodb.org/master/reference/operator/aggregation/sum/聚合累加器。

这为您提供了一个“逻辑匹配”,可以根据指定的分组键对聚合操作中的每个相应“类型”进行计数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 聚合不同文档中两个数组中的项目计数? 的相关文章

  • 在承诺中运行同步函数

    我是 JS 和异步操作的新手 在使用express的nodeJS路由器中 我使用mongoose从mongo聚合了一些数据 该数据是每隔 15 分钟从不同站点收集的天气数据 我使用猫鼬聚合管道处理数据 以获取每小时数据并按每个站点进行分组
  • MongoDB 如何使用 $date 运算符进行查询?

    编辑 上下文 我正在使用 Talend ETL 工具 并在查询中使用 ISODate 或 Date 或 new Date 如下所示失败并出现错误 因此我需要解决方法 dt ISODate 2014 01 01 dt Date 2014 01
  • 将字符串数组转换为对象 Id 数组

    我有一个字符串数组 let stringObjectIdArray fssdlfsd343 43434234242 342424242 我想使用 mongoose 类型将字符串数组更改为对象 Id 数组 但它不起作用 它仅适用于字符串而不是
  • 从节点使用 TypeScript 编译器

    使用咖啡脚本可以很容易地做到这一点 var coffee require coffee script coffee compile a 1 gt function n var a n n a 1 n n call this n 有没有办法用
  • mocha——手表和猫鼬模型

    如果我让 mocha 监视更改 每次保存文件时 mongoose 都会抛出以下错误 OverwriteModelError 无法覆盖Client模型一旦编译 我知道猫鼬不允许两次定义模型 但我不知道如何让它与mocha watch clie
  • 使用单个“proxyServer”将 Websocket 代理到多个目标

    我正在开发一个nodeJS websocket代理服务器 用例是当 websocket 请求到来时 我将检查其凭据 添加新标头 然后根据其组 来自用户 ID 将 websocket 连接重定向到其目标 webscoket 服务器 我发现大多
  • DeprecationWarning:当我将脚本移动到另一台服务器时,由于安全和可用性问题,Buffer() 已被弃用

    当脚本移动到其他服务器时出现错误 节点 15707 DEP0005 DeprecationWarning 由于安全和可用性问题 Buffer 已被弃用 请改用 Buffer alloc Buffer allocUnsafe 或 Buffer
  • 如何在 NodeJS 中允许表单数据

    我最近创建了一个接受文件的 API 我正在尝试使用 Postman 测试 API 如果我使用发出帖子请求x wwww form urlencoded身体类型 一切正常 我得到了所有预期的数据 唯一的问题是它不允许发送文件 如果我使用form
  • Mongoose 限制/偏移量和计数查询

    查询性能有点奇怪 我需要运行一个查询来计算文档总数 并且还可以返回一个可以限制和偏移的结果集 所以 我总共有 57 个文档 用户想要 10 个文档偏移 20 我可以想到两种方法来做到这一点 首先是查询所有 57 个文档 以数组形式返回 然后
  • 在 Windows 7 - 64 位上安装 Mongodb

    我是 mongodb 的新手 不知道如何安装它 因为我找不到视频或任何有用的资源来实现相同的目的 请帮助我在 Windows 7 上安装 mongodb 并提供确切的步骤 我尝试从该网站下载最新版本的 mongodb 但不成功 提前致谢 R
  • 如何使用 Passport-saml 向 TestShib IdP 提供 SP 元数据?

    我有一个node js脚本 使用护照 saml https www npmjs com package passport saml 模拟 SP 我的目标是将其连接到此TestShib IdP https idp testshib org i
  • 如何运行指定 node.js 版本 8 的 eb init?

    I run eb init并部署 我得到了node js版本6 如何在执行时指定我想要node js版本8eb init命令 这是一个有趣的问题 我很想知道是否有更简单的方法 但我是这样实现的 确定最新的SolutionStack名称如所列
  • 如何在 docker 容器中仅设置 python 2.7?

    我有节点应用程序 在一个用例中 我使用以下命令从节点调用 python 脚本python shell https www npmjs com package python shell 我正在尝试在 docker 上设置这个应用程序 我的 D
  • Express+jade:局部变量在视图中不可用

    我遇到了一个非常基本的问题 但我似乎找不到答案 我正在与node js express我只是想将局部变量传递到视图中 如下所示 app get function req res res render index locals title B
  • Express 4 中的查询字符串变量仍然为空

    按照此处的建议编写简单的服务器堆栈溢出 https stackoverflow com questions 5710358 how to retrieve post query parameters 休息 api js const expr
  • NodeJS 路由器负载太大

    我在 Nodejs 应用程序中创建休息端点 如下所示 在我的 server js 中 我有以下代码 var express require express var app express app use express json limit
  • 使用 Puppeteer 和 Headless Chrome 获取 DOM 节点文本

    我正在尝试使用无头 Chrome 和 Puppeteer 来运行我们的 Javascript 测试 但我无法从页面中提取结果 基于这个答案 https stackoverflow com a 45799744 4794 看起来我应该使用pa
  • 使用 NodeJS 创建 YouTube 播放列表

    我正在尝试使用 NodeJS 服务器创建 YouTube 播放列表 我已按照 Oauth 的 NodeJS 快速入门说明进行操作 如以下链接所示 https github com youtube api samples blob maste
  • 使用 Connect 和 node-http-proxy 的 HTTP 代理

    在开发过程中 我需要一个 HTTP 代理来访问外部 API 以绕过跨域安全限制 我在这里找到了一些示例代码 http nthloop com blog local dev with nodejs proxy http nthloop com
  • 运行 pm2 记录错误 SyntaxError: Unexpected token

    我想查看我的项目的日志 Steps 我克隆了一个套接字应用程序 然后我跑npm install pm2 g安装pm2 I run pm2 start 有用 它显示我的套接字应用程序的表格 但如果我跑pm2 logs查看日志 存在这样的错误

随机推荐