按两个字段分组时,在MongoDB聚合中创建唯一字段,并用于排序

2w2cym1i  于 2023-03-07  发布在  Go
关注(0)|答案(3)|浏览(99)

在聚合具有以下管道阶段的集合时

let ap = [{
          $group: {
            _id: {
              year: { $year: '$itemDate' },
              month: { $month: '$itemDate' },
            },
            count: { $sum: 1 },
          },
        }]

我收到这样的东西...

[
  { _id: { year: 2022, month: 9 }, count: 2 },
  { _id: { year: 2022, month: 4 }, count: 232 },
  { _id: { year: 2022, month: 3 }, count: 259 },
  { _id: { year: 2022, month: 8 }, count: 12 },
  { _id: { year: 2022, month: 1 }, count: 76 }
]

我希望使用$addFields stage(或类似的stage),这样我的结果将具有一个键,并按年-月排序,如下所示

[
  { _id: { year: 2022, month: 1 }, count: 76, key: '2022-01'},
  { _id: { year: 2022, month: 3 }, count: 259, key: '2022-03'},
  { _id: { year: 2022, month: 4 }, count: 232, key: '2022-04'},
  { _id: { year: 2022, month: 8 }, count: 12, key: '2022-08'},
  { _id: { year: 2022, month: 9 }, count: 2, key: '2022-09'},
]

我试过一个模板字符串,但它不工作。我也不知道这将是如何排序要么...

ap.push({
  $addFields: {
    key: `${'$_id.year'}-${'$_id.month'}`,
    key2: '$_id.year',
   },
});

任何帮助都将不胜感激。

ukdjmx9f

ukdjmx9f1#

使用$concat链接$toString的结果

db.collection.aggregate([
  {
    "$addFields": {
      "key": {
        "$concat": [
          {
            "$toString": "$_id.year"
          },
          "-",
          {
            "$toString": "$_id.month"
          }
        ]
      }
    }
  },
  {
    $sort: {
      key: 1
    }
  }
])

Mongo Playground

xwbd5t1u

xwbd5t1u2#

您可以使用$project$group$sort的3步聚合管道。

[
  {
    '$project': {
      '_id': true, 
      'itemDate': true, 
      'key': {
        '$concat': [
          {
            '$toString': {
              '$year': '$itemDate'
            }
          }, '-', {
            '$toString': {
              '$month': '$itemDate'
            }
          }
        ]
      }
    }
  }, {
    '$group': {
      '_id': '$key', 
      'count': {
        '$sum': 1
      }
    }
  }, {
    '$sort': {
      'key': -1
    }
  }
]
iyr7buue

iyr7buue3#

备选办法1:
排序不需要单独的键,只需按_id.year_id.month排序即可。

db.collection.aggregate([
  {
    $group: {
      _id: {
        year: {$year: "$itemDate"},
        month: {$month: "$itemDate"},
        
      },
      count: {$sum: 1}
    }
  },
  {
    $sort: {
      "_id.year": 1,"_id.month": 1
    }
  }
])

Demo
备选方案二:
在$group stage中创建字段,而不是另一个stage。将日期转换为字符串,并从组中选择$first。

db.collection.aggregate([
  {
    $group: {
      _id: {
        year: {$year: "$itemDate"},
        month: {$month: "$itemDate"},
        
      },
      count: {$sum: 1},
      key: {
        $first: {
          $dateToString: {date: "$itemDate", format: "%Y-%m"}
        }
      }
    }
  },
  {
    $sort: {
      "key": 1
    }
  }
])

Demo

相关问题