Mongodb Mongdb聚合第一组内的第二组阶段输出

Mongodb Mongdb聚合第一组内的第二组阶段输出,mongodb,mongoose,aggregate,Mongodb,Mongoose,Aggregate,我不知道是否可能,但我想从聚合管道中获得特定的输出 对象示例: { "_id": "6001d736e6dc1c55e893158d", "manager": "6000da590ed6253807158216", "label": "Test", "identifier": "Test", "interva

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

对象示例:

{
  "_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',
    },
}
有人知道想要的输出是否可能,如果可能,如何实现吗


谢谢

一般步骤如下:

  • $group by
    单元
    日期
    ,将所有文档推送到传感器阵列中
  • $project创建一个带有{k:,v:}的新字段
  • $group by date,将新字段推入数组
  • 要转换数组的$project和$arrayToObject
  • $addFields以在新对象中包含日期
  • $replaceRoot以升级新对象
非常感谢您,经过几个小时和多次尝试,我最终得出以下结论:

this.sensorModel
  .aggregate()
  .group({
    '_id': {
      date: { '$year': '$created_at' },
      'unit': '$unit',
    },
    test: { '$addToSet': '$$ROOT' },
  })
  .project({
    newField: {
      k: '$_id.unit',
      v: '$test',
    }
  })
  .group({
    '_id': '$_id.date',
    data: { '$addToSet': '$newField', },
  })
  .project({
    'sensors': { $arrayToObject: '$data', },
  })
  .replaceRoot({
    $arrayToObject: [[{k: {$toString: '$_id'}, v: '$sensors'}]]
  })
  .exec();
结果几乎是完美的:

[
  {
    "2021": {
      "°C": [
        {
          "_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
        },
      ],
      "X": [
        {
          "_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": "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
        },
      ]
    }
  }
]

单位是否总是
X
°C
%
中的一个,或者可能还有其他单位?还有其他单位,但如果问题很大,我可以先执行另一个请求以检索所有单位。
[
  {
    "2021": {
      "°C": [
        {
          "_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
        },
      ],
      "X": [
        {
          "_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": "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
        },
      ]
    }
  }
]