首页 > 解决方案 > Mongdb 聚合在第一组阶段输出中进行第二组

问题描述

我不知道这是否可能,但我想从聚合管道获得特定的输出。

示例对象:

{
  "_id": "6001d736e6dc1c55e893158d",
  "manager": "6000da590ed6253807158216",
  "label": "Test",
  "identifier": "Test",
  "interval": 11,
  "unit": "X",
  "created_at": "2021-01-15T17:56:06.749Z",
  "updated_at": "2021-01-21T12:21:35.670Z",
  "__v": 0
},
{
  "_id": "6030236f976756b0b2d74556",
  "manager": "6022f3285752fec73393bda2",
  "label": "Temperature salon",
  "identifier": "DS18B20_TEMP",
  "interval": 60,
  "unit": "°C",
  "created_at": "2021-02-19T20:45:35.847Z",
  "updated_at": "2021-02-19T20:45:35.847Z",
  "__v": 0
}

我正在尝试按日期和单位(对象中的字段)获取一个组,我成功地分开做,但我找不到在同一管道中做这两个的解决方案。

如果我按月进行第一组的预期输出:

{
  "_id": "2021-01-00T00:00:00.000Z",
  "X": objectsArray[],
  "°C": objetcsArray[]
},
{
  "_id": "2021-02-00T00:00:00.000Z",
  "X": objectsArray[],
  "°C": objetcsArray[]
}

我目前在这个小组中拥有的东西:

{
    '_id': {
        '$add': [
        { '$subtract': [
            { '$subtract': [ '$created_at', new Date(0) ] },
            { '$mod': [
                { '$subtract': [ '$created_at', new Date(0) ] },
                this.millisecondsIn(interval),
                ]},
            ]},
        new Date(0),
        ]
    },
    sensors: {
        $addToSet: '$$ROOT',
    },
}
  {
    "_id": "2021-01-21T00:00:00.000Z",
    "sensors": [
      {
        "_id": "601ab8f623224a5387c6252d",
        "manager": "6000da590ed6253807158216",
        "label": "Test",
        "identifier": "Test2",
        "interval": 60,
        "unit": "°C",
        "created_at": "2021-02-03T14:53:42.538Z",
        "updated_at": "2021-02-03T14:53:42.538Z",
        "__v": 0
      },
      {
        "_id": "6029ad3dda9bafb99cf0b4d5",
        "manager": "6022f3285752fec73393bda2",
        "label": "Test sensor 1",
        "identifier": "RANDOMID",
        "interval": 60,
        "unit": "°C",
        "created_at": "2021-02-14T23:07:41.255Z",
        "updated_at": "2021-02-14T23:07:41.255Z",
        "__v": 0
      }
    ]
  },
  {
    "_id": "2020-12-24T00:00:00.000Z",
    "sensors": [
      {
        "_id": "6001917f41c38212a477a2ce",
        "manager": "6000da590ed6253807158216",
        "label": "Test label",
        "identifier": "TEst id",
        "interval": 10,
        "unit": "%",
        "created_at": "2021-01-15T12:58:39.514Z",
        "updated_at": "2021-01-16T19:08:40.239Z",
        "__v": 0
      },
      {
        "_id": "6001d736e6dc1c55e893158d",
        "manager": "6000da590ed6253807158216",
        "label": "Test",
        "identifier": "Test",
        "interval": 11,
        "unit": "X",
        "created_at": "2021-01-15T17:56:06.749Z",
        "updated_at": "2021-01-21T12:21:35.670Z",
        "__v": 0
      }
    ]
  },
  {
    "_id": "2021-02-18T00:00:00.000Z",
    "sensors": [
      {
        "_id": "6030238d976756b0b2d74557",
        "manager": "6022f3285752fec73393bda2",
        "label": "Taux d'humidité salon",
        "identifier": "DHT_22_HUM",
        "interval": 60,
        "unit": "%",
        "created_at": "2021-02-19T20:46:05.042Z",
        "updated_at": "2021-02-19T20:46:05.042Z",
        "__v": 0
      },
      {
        "_id": "60302357976756b0b2d74555",
        "manager": "6022f3285752fec73393bda2",
        "label": "Temperature salon",
        "identifier": "DTH_22_TEMP",
        "interval": 60,
        "unit": "°C",
        "created_at": "2021-02-19T20:45:11.071Z",
        "updated_at": "2021-02-19T20:45:11.071Z",
        "__v": 0
      },
      {
        "_id": "6030236f976756b0b2d74556",
        "manager": "6022f3285752fec73393bda2",
        "label": "Temperature salon",
        "identifier": "DS18B20_TEMP",
        "interval": 60,
        "unit": "°C",
        "created_at": "2021-02-19T20:45:35.847Z",
        "updated_at": "2021-02-19T20:45:35.847Z",
        "__v": 0
      }
    ]
  }

有谁知道想要的输出是否可能,如果是,如何?

谢谢

标签: mongodbmongooseaggregate

解决方案


一般步骤是:

  • $group by unitand date,将所有文档推送到传感器数组中
  • $project 用 {k: <unit value>, v: <sensors array>} 创建一个新字段
  • $group 按日期,将新字段推入数组
  • $project 与 $arrayToObject 转换数组
  • $addFields 在新对象中包含日期
  • $replaceRoot 提升新对象

推荐阅读