【发布时间】:2013-04-03 04:35:58
【问题描述】:
聚合框架的$max 运算符如何评估复合键。例如:
{
$project: {
user: 1,
record: { date: "$upload_date", comment: 1, some_integer: 1 }
}
},
{
$group: {
_id: "$user",
latest: { $max : "$record" }
}
}
它会通过date、comment 或some_integer 获得最大值吗?我只是假设它将通过date 获得最新消息。如果错了,找到date最大值的正确方法是什么?
编辑
从我到目前为止的尝试来看,最新的记录是由第一个键确定的。这是正确的行为吗?
编辑
为了了解我的用例,我有以下文档:
> db.logs.findOne()
{
'id': ObjectId("50ad8d451d41c8fc58000003")
'name': 'Sample Log 1',
'uploaded_at': ISODate("2013-03-14T01:00:00+01:00"),
'case_id': '50ad8d451d41c8fc58000099',
'result': 'passing'
'tag': ['TAG-XYZ']
}
我有以下聚合:
db.test_case_logs.aggregate(
{$project: {tag:'$tag', case:'$case_id',
latest: {upload_date:1, date:'$upload_date', result:'$result',
passing : { $cond : [ { $eq : ["$result","passing"] }, 1, 0 ] },
failing : { $cond : [ { $eq : ["$result","failing"] }, 1, 0 ] }}
}},
{$unwind: '$tag'},
{$group: {_id:{tag:'$tag',case:'$case'}, latest:{$max:'$latest'}}},
{$group: {_id:'$_id.tag',total:{$sum:1}, passing:{$sum:{$latest.passing}},
failing:{$sum:{$latest.failing}, date:{$max:{$latest.upload_date}}}
},
{'$sort': {'date':-1}}
)
日志可以具有相同的名称tag 和case_id,并且在分组两次之后,我需要结果是每个upload_date 对于每个tag 的最新日志。
编辑
我的预期结果是这样的:
{
'_id':'TAG-XYZ',
'total':'1'
'passing':'1'
'failing':'0'
}
每个计数对应给定案例的最新日志。
【问题讨论】:
-
您使用的是什么版本的 MongoDB?
-
我使用的是 MongoDB 2.2
-
在更新聚合操作中,你unwindtag字段,但是tag的值不是数组,这样会报错。您能否提供有关查询和预期结果的更多信息? (例如 $sum 操作)
-
@LindaQin,对不起,这是一个错字,我也忘了在查询中添加一些字段。请查看最新编辑。放心,这是我目前的实现。
标签: mongodb aggregation-framework