假设之前,我有以下的文档结构:匹配的唯一的一组领域的最新文件聚集
> db.logs.find()
{
'id': ObjectId("50ad8d451d41c8fc58000003")
'name': 'Sample Log 1',
'uploaded_at: ISODate("2013-03-14T01:00:00+01:00"),
'case_id: '50ad8d451d41c8fc58000099',
'tag_doc': {
'group_x: ['TAG-1','TAG-2'],
'group_y': ['XYZ']
}
},
{
'id': ObjectId("50ad8d451d41c8fc58000004")
'name': 'Sample Log 2',
'uploaded_at: ISODate("2013-03-15T01:00:00+01:00"),
'case_id: '50ad8d451d41c8fc58000099'
'tag_doc': {
'group_x: ['TAG-1'],
'group_y': ['XYZ']
}
}
> db.cases.findOne()
{
'id': ObjectId("50ad8d451d41c8fc58000099")
'name': 'Sample Case 1'
}
是否有在聚合框架进行$match
的方式,将只检索所有最新的Log
case_id
和group_x
的每个唯一组合?我确信这可以通过多个$group
管道来完成,但我希望尽可能地通过$match
运营商立即限制将通过管道的文档数量。我正在考虑像$max
运营商,但在$match
中使用它。
任何帮助,非常感谢。
编辑:
到目前为止,我能想出以下:
db.logs.aggregate(
{$match: {...}}, // some match filters here
{$project: {tag:'$tag_doc.group_x', case:'$case_id', latest:{uploaded_at:1}}},
{$unwind: '$tag'},
{$group: {_id:{tag:'$tag', case:'$case'}, latest: {$max:'$latest'}}},
{$group: {_id:'$_id.tag', total:{$sum:1}}}
)
正如我所说,我希望可以与多个$group
管道来完成,但是这被证明是代价高昂处理大量文件时。这就是为什么我想尽早限制文件的原因。
编辑:
我还没有想出了一个很好的解决方案,如果该文档结构本身对我的使用情况没有优化,所以我想。我是否必须更新字段以支持我想实现的目标?非常感谢的建议。
编辑:
我其实寻找一个类似于预计How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL? MongoDB中实现不同的是它涉及到两个不同的字段值。此外,$match
操作至关重要,因为它使结果集动态变化,过滤器的范围可以匹配标签或日期范围内。
编辑:
由于我的用例的复杂性我试图用一个简单的比喻,但这被证明是令人困惑的。以上是现在用例的简化形式。对不起,我创建了混乱。
样本结构更新为与实际文档结构相匹配。 – MervS 2013-03-20 07:49:20
对此问题的任何建议? – MervS 2013-03-22 01:51:58