【问题标题】:Mongdb aggregate do second group inside first group stage outputMongodb聚合在第一组阶段输出中进行第二组
【发布时间】:2021-07-05 20:07:13
【问题描述】:

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

示例对象:

{
  "_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
      }
    ]
  }

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

谢谢

【问题讨论】:

  • 单位是否总是X°C% 之一,或者可能还有其他单位?
  • 还有其他的,但如果问题很大,我可以先做另一个请求来检索所有单元。

标签: mongodb mongoose aggregate


【解决方案1】:

非常感谢Joe,经过几个小时和多次尝试,我最终得到了这个:

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
        },
      ]
    }
  }
]

【讨论】:

    【解决方案2】:

    一般步骤是:

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

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 2017-01-04
      • 2018-06-23
      • 2019-05-25
      • 1970-01-01
      • 2019-01-27
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多