我有以下查询:
HOST_USAGE.aggregate([{
'$match': {'sysstat.host.nodename': host}
}, {
'$project': {'ts': '$sysstat.host.statistics.timestamp'}
}, {
'$unwind': '$ts'
}, {
'$unwind': '$ts.cpu-load-all.cpu'
}, {
'$group': {
'_id': 0,
'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'}
}
}])
但是,还有一个我想抓住的字段$sysstat.host.statistics.timestamp[*].time
我试过了,
'$group': {
'_id': 0,
'all-usr': {'$max': '$ts.cpu-load-all.cpu.usr'},
'time': '$ts.time'
}
但这会产生错误:pymongo.errors.OperationFailure: exception: the group aggregate field 'time' must be defined as an expression inside an object
。我如何$group
某些字段,并将其他字段投影到返回的数据集中?
答案 0 :(得分:1)
如果您要对任何字段进行分组,则必须对所有字段进行分组。您可以使用$ push或$ addToSet来获取时间戳数组:
HOST_USEAGE.aggregate([{
'$match': {'sysstat.host.nodename': 1}
}, {
# Rename the field for brevity.
'$project': {'ts': '$sysstat.host.statistics.timestamp'}
}, {
'$unwind': '$ts'
}, {
'$unwind': '$ts.cpu-load-all.cpu'
}, {
'$group': {
'_id': 0,
'all-usr': {'$sum': '$ts.cpu-load-all.cpu.usr'},
'times': {'$addToSet': '$ts.time'}
}
}])))
我建议使用$addToSet
以避免输出数组中的重复次数:$push
每次“cpu-load-all”条目都会给出一个副本,因为$ unwind的工作方式。