在MongoDB中对集合的子组进行排序和限制的最佳方法是什么?

时间:2019-03-15 23:11:24

标签: database mongodb sorting mongodb-query aggregation-framework

我有一个集合,其数据类似于以下形状:

[
  {
    "_id": "67tghy",
    "organization": "Organization A",
    "marketValue": 500000,
    "month": 8,
    "year": 2018,
    "project": "Project Blue"
  },
  {
    "_id": "h67thgk",
    "organization": "Organization B",
    "marketValue": 900000,
    "month": 1,
    "year": 2018,
    "project": "Project Red"
  }
]

此收藏集中有1万多个文档。我需要获取每个project组内的最新数据子集。

换句话说,将数据按project分组,获取每个project的最新月/年数据,然后将所有数据合并回去(对于我正在使用的应用程序,它必须具有与开始时相同的形状)。

下面的聚合管道是我实现上述目标的最佳方案。

[
  {
    $group: {
      _id: {
        project: '$project',
        year: '$year',
        month: '$month'
      },
      data: { $push: '$$ROOT' }
    }
  },
  {
    $sort: {
      '_id.year': -1,
      '_id.month': -1
    }
  },
  {
    $group: {
      _id: {
        project: '$_id.project'
      },
      data: { $push: '$data'}
    }
  },
  {
    $project: {
      latestData: { $slice: ['$data', 1] }
    }
  },
  {
    $unwind: '$latestData'
  },
  {
    $unwind: '$latestData'
  },
  {
    $replaceRoot: {
      newRoot: '$latestData'
    }
  }
]

我希望有一种方法可以在嵌套的不同层次上对数据进行排序和限制,就像使用d3.nest一样,但是在MongoDB文档中没有看到类似的东西。

写聚合管道的最佳方法是什么?

0 个答案:

没有答案