【问题标题】:MongoDB (Mongoose) - grouping data under a unique fieldMongoDB (Mongoose) - 在一个唯一字段下分组数据
【发布时间】:2022-01-09 17:40:52
【问题描述】:

在集合中,我有这样的条目:

[
    {
        _id: new ObjectId('61cae11f8fc0b2e3b045be04'),
        location: 'Station One',
        datetime: ISODate('2019-02-02T12:54:57.937Z'),
        sensorType: 'temperature',
        value: -1.8,
        __v: 0,
    },
    {
        _id: new ObjectId('61cae11f8fc0b2e3b045be05'),
        location: 'Station two',
        datetime: ISODate('2019-02-02T09:49:39.200Z'),
        sensorType: 'temperature',
        value: -2,
        __v: 0,
    },
];

我有一个聚合查询来获取每个传感器类型的最小/最大值,就像这样

const queryMinMax = FarmDataModel.aggregate([
    {
        $match: match,
    },
    {
        $sort: {
            value: 1,
        },
    },
    {
        $group: {
            _id: {
                sensorType: '$sensorType', location: '$location',
            },
            min: {
                $first: '$$ROOT',
            },
            max: {
                $last: '$$ROOT',
            },
        },
    },
    {
        $sort: {
            '_id.location': 1,
            '_id.sensorType': 1,
        },
    },
    {
        $project: {
            _id: 1,
            max: {
                value: '$max.value',
                month: { $month: '$max.datetime' },
                year: { $year: '$max.datetime' },
                day: { $dayOfMonth: '$max.datetime' },
            },
            min: {
                value: '$min.value',
                month: { $month: '$min.datetime' },
                year: { $year: '$min.datetime' },
                day: { $dayOfMonth: '$min.datetime' },
            },
        },
    },
]);

这为每个传感器类型和相应的最小最大值提供了一行。 我想做的是将每个传感器类型分组在一个位置下,以便查询将返回如下内容:

{
    'Station One': {
        temperature: {
            min: { value: number; date: date }
            max: { value: number; date: date },
        },
        pH: {
            min: { value: number; date: date }
            max: { value: number; date: date },
        },
    },

    'Station Two': {
        temperature: {
            min: { value: number; date: date }
            max: { value: number; date: date },
        },
        pH: {
            min: { value: number; date: date }
            max: { value: number; date: date },
        },
    },
};

因此,如果之前我得到 4 行,每个位置的每个 sensorType 一个,现在我会得到两行,每个位置一个,在这些行下,每个 sensorType 都有 key:value 对

我可以修改我的查询来实现吗?

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以在现有管道上构建,只需另一个 $group 阶段按站对数据进行分组,然后对其进行一些重组以匹配您想要的输出,如下所示:

    db.collection.aggregate([
      ... existing pipeline,
      {
        $group: {
          _id: "$_id.location",
          sensorData: {
            $push: {
              k: "$_id.sensorType",
              v: {
                max: "$max",
                min: "$min"
              }
            }
          }
        }
      },
      {
        "$replaceRoot": {
          "newRoot": {
            "$arrayToObject": [
              [
                {
                  k: "$_id",
                  v: {
                    "$arrayToObject": "$sensorData"
                  }
                }
              ]
            ]
          }
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2014-07-22
      • 2019-11-06
      • 2012-08-27
      • 2014-10-28
      • 1970-01-01
      • 2012-09-05
      • 2012-12-24
      相关资源
      最近更新 更多