我有一个集合,其数据类似于以下形状:
[
{
"_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文档中没有看到类似的东西。
写聚合管道的最佳方法是什么?