假设我有以下文档结构:
> 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
管道来完成,但是在处理大量文档时这被证明是昂贵的。这就是为什么,我想尽早限制文件。
编辑:
我还没有想出一个好的解决方案,所以我在考虑文档结构本身是否没有针对我的用例进行优化。我是否必须更新字段以支持我想要实现的目标?建议非常感谢。
编辑:
我实际上正在寻找 mongodb 中的实现,类似于我如何在 SQL 中的另一列中选择具有 MAX(列值)、DISTINCT 的行?除了它涉及两个不同的字段值。此外,该$match
操作至关重要,因为它使结果集动态化,过滤器范围为匹配标签或日期范围内。
编辑:
由于我的用例的复杂性,我尝试使用一个简单的类比,但这被证明是令人困惑的。以上是实际用例的简化形式。对我造成的混乱感到抱歉。