首页 > 解决方案 > MongoDB中的数据不按时间顺序排列

问题描述

使用聚合,我每月每天都在获取数据。在这个例子中,我得到的数据是从 2020-05-28 到 2020-06-04。数据没问题,但不是顺序,因为它没有按时间顺序执行,因为它从 1 到 4,然后跳到 28,如下例所示:

{'_id': 1, 'count': 205}
{'_id': 2, 'count': 128}
{'_id': 3, 'count': 142}
{'_id': 4, 'count': 116}
{'_id': 28, 'count': 165}
{'_id': 29, 'count': 203}
{'_id': 30, 'count': 173}
{'_id': 31, 'count': 202}

这是它应该如何工作的:

{'_id': 28, 'count': 165}
{'_id': 29, 'count': 203}
{'_id': 30, 'count': 173}
{'_id': 31, 'count': 202}
{'_id': 1, 'count': 205}
{'_id': 2, 'count': 128}
{'_id': 3, 'count': 142}
{'_id': 4, 'count': 116}

有什么猜测吗?感谢您的帮助。

聚合:

[{$match: {
  start_date: {
    $gte: ISODate('2020-05-28T10:00:01.000Z'),
    $lte: ISODate('2020-06-04T09:59:59.000Z')
  }
}}, {$project: {
  'day': {
      '$dayOfMonth': {
          'date': '$start_date',
          'timezone': 'America/Mexico_City'
      }
  }
}}, {$group: {
  '_id': '$day',
    'count': {
        '$sum': 1
    }
}}, {$sort: {
  '_id': 1
}}]

标签: mongodbmongodb-queryaggregation-framework

解决方案


我们可以做这样的事情

db.collection.aggregate([
  {
    $match: {
      start_date: {
        $gte: ISODate("2020-05-28T10:00:01.000Z"),
        $lte: ISODate("2020-06-04T09:59:59.000Z")
      }
    }
  },
  {
    $group: {
      _id: {
        month: {
          $month: {
            "date": "$start_date",
            "timezone": "America/Mexico_City"
          }
        },
        day: {
          $dayOfMonth: {
            "date": "$start_date",
            "timezone": "America/Mexico_City"
          }
        },
        year: {
          $year: {
            "date": "$start_date",
            "timezone": "America/Mexico_City"
          }
        }
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    $sort: {
      "_id.year": 1,
      "_id.month": 1,
      "_id.day": 1
    }
  }
])

对于您的方案,它需要按完整日期分组,以便same dates with different month/year区分。


您可以在此处查看工作示例 https://mongoplayground.net/p/qOoG-3V-S1P


推荐阅读