javascript - 如何在mongodb中replaceRoot后进一步分组对象

标签 javascript node.js mongodb aggregation-framework nodejs-server

{
    "169v55": [
      {
        "code": "2001",
        "active": true,
        "delist": false
      }
    ],
    "SLO1019jkf": [
      {
        "code": "MOUNTY2026",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T15:36:51.819Z"
      },
      {
        "code": "MOUNTY2027",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T16:25:32.437Z"
      },
      {
        "code": "MOUNTY2054",
        "active": false,
        "delist": false,
        "createdAt": "2020-02-17T05:47:28.558Z"
      }
    ]
}

以上结果是我替换 newRoot 后得到的。这是我的分组代码,上面给出了结果

{
    $group: group
},
{
    $project: {
      doc: "$doc",
      date: date,
      type: type
    }
},
{
    $group: {
      _id: null,
      locations: {
        $push: {
          k: "$_id",
          v: "$doc"
        }
      }
    }
},
{
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$locations"
      }
    }
}

现在我需要再次使用 active 和 delist 进行分组。所以,我想要的输出如下

{
  "169v55": {
    active: 1,
    inactive: 2
  },
  "SLO1019jkf": {
    active: 0,
    inactive: 3
  }
}

上面的 { active: 1, inactive: 2 } 表示 activeinactive 文档各自数组的总数。

最佳答案

我没有看到实际的输入文档。如果顶部的输出来自此管道,则小组赛阶段之前的两个文档看起来像(我不知道 type 用于包含什么):

{
    _id: "169v55",
    doc:{
        "code": "2001",
        "active": true,
        "delist": false
      },
    type: unknown
}

{
    _id: "SLO1019jkf",
    doc:{
        "code": "MOUNTY2026",
        "active": false,
        "delist": false,
        "createdAt": "2019-12-26T15:36:51.819Z"
      },
    type: unknown
}

因此,如果您要根据位置进行分组,您可以总结事件和非事件:

{$group:{
    _id:"$_id",
    active: {$sum:{$cond:[{$eq:["$active",true]},1,0]}},
    inactive: {$sum:{$cond:[{$eq:["$active",false]},1,0]}}
}}

这将为您提供单独文档中的每个位置以及计数。如果您需要它们实际上位于单个数组中,请像您一样按 null 分组,但推送计数而不是原始文档字段:

{ k:"$_id", v:{active:"$active",inactive:"$inactive"} }

关于javascript - 如何在mongodb中replaceRoot后进一步分组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60862113/

相关文章:

database - MongoDB:在没有 MapReduce 的情况下对对象中的值求和

javascript - extjs。如何更改 Ext.field.DatePicker 的数据格式

javascript - 如何在不使用 Webpack 的情况下从公共(public)文件夹获取图像

node.js - 如何解决类型错误: this is not a typed array

node.js - 将文档数组显示为以 id 为键的对象

javascript - 从 mongodb Node js 搜索记录时出现问题?

javascript - 通过递归进入输入的反向数字

javascript - 如何将地址转换为经纬度然后在页面上显示 map

javascript - 使用 Node.js 解析 CodeIgniter cookie

node.js - MongoDB - 使用多个查找的 $group、辅助 $group、$sum 字段