多个键的总计
Aggregate totals for Multiple Keys
下面给出一个文档的如下数据结构:
{
"_id" : x,
"device_model_id": x,
"device_os_id": x,
"device_status_id" : x,
}
我想按 device_status 和 device_os 对数据进行分组:
{u'ok': 1.0, u'result': [
{
u'_id': {u'device_os_id': 2, u'device_status_id': 2},
u'total': $sum,
u'models': {
'device_model_id': 1,
'total_device_model': $sum
}
},
{
u'_id': {u'device_os_id': 1, u'device_status_id': 1},
u'total': $sum,
u'models': {
'device_model_id': 4,
'total_device_model': $sum
}
},
.....
到目前为止我有以下代码:
testing = self.collection.aggregate([
{'$group': {
'_id': {'device_os_id': "$device_os_id", 'status': '$device_status_id'},
'total': {'$sum': 1},
'models': {'$addToSet': "$device_model_id"},
}}
])
这给了我以下结果:
{u'ok': 1.0, u'result': [
{u'total': 20355, u'models': [18, 2, 3], u'_id': {u'device_os_id': 2, u'status': 2}},
{u'total': 38429, u'models': [18, 19, 2, 3], u'_id': {u'device_os_id': 2, u'status': 1}},
{u'total': 1, u'models': [15], u'_id': {u'device_os_id': 1.0, u'status': 1}}]}
我还没有找到将每个 device_model_id 的总和添加到 'models' 列表的方法。
有谁知道我怎么能做到这一点?
非常感谢您的帮助。
您在两个 $group
管道阶段执行此操作,首先是所有键,包括 "model",然后仅针对较低级别的细节:
self.collection.aggregate([
{ '$group': {
'_id': {
'device_os_id': "$device_os_id",
'status': '$device_status_id',
'model': '$device_model_id'
},
'total': {'$sum': 1}
}},
{ '$group': {
'_id': {
'device_os_id': '$_id.device_os_id',
'status': '$_id.status'},
},
'models': { '$push': { 'model': '$_id.model', 'total': '$total' } },
'total': { '$sum': '$total' }
}}
])
作为"pipeline",第一阶段在一个级别上进行压缩并获取详细信息总计。 "second" 阶段所做的就是将现在已经对 "model" 唯一的内容折叠成一个 "models" 数组,并将其他分组项目作为键。
下面给出一个文档的如下数据结构:
{
"_id" : x,
"device_model_id": x,
"device_os_id": x,
"device_status_id" : x,
}
我想按 device_status 和 device_os 对数据进行分组:
{u'ok': 1.0, u'result': [
{
u'_id': {u'device_os_id': 2, u'device_status_id': 2},
u'total': $sum,
u'models': {
'device_model_id': 1,
'total_device_model': $sum
}
},
{
u'_id': {u'device_os_id': 1, u'device_status_id': 1},
u'total': $sum,
u'models': {
'device_model_id': 4,
'total_device_model': $sum
}
},
.....
到目前为止我有以下代码:
testing = self.collection.aggregate([
{'$group': {
'_id': {'device_os_id': "$device_os_id", 'status': '$device_status_id'},
'total': {'$sum': 1},
'models': {'$addToSet': "$device_model_id"},
}}
])
这给了我以下结果:
{u'ok': 1.0, u'result': [
{u'total': 20355, u'models': [18, 2, 3], u'_id': {u'device_os_id': 2, u'status': 2}},
{u'total': 38429, u'models': [18, 19, 2, 3], u'_id': {u'device_os_id': 2, u'status': 1}},
{u'total': 1, u'models': [15], u'_id': {u'device_os_id': 1.0, u'status': 1}}]}
我还没有找到将每个 device_model_id 的总和添加到 'models' 列表的方法。 有谁知道我怎么能做到这一点? 非常感谢您的帮助。
您在两个 $group
管道阶段执行此操作,首先是所有键,包括 "model",然后仅针对较低级别的细节:
self.collection.aggregate([
{ '$group': {
'_id': {
'device_os_id': "$device_os_id",
'status': '$device_status_id',
'model': '$device_model_id'
},
'total': {'$sum': 1}
}},
{ '$group': {
'_id': {
'device_os_id': '$_id.device_os_id',
'status': '$_id.status'},
},
'models': { '$push': { 'model': '$_id.model', 'total': '$total' } },
'total': { '$sum': '$total' }
}}
])
作为"pipeline",第一阶段在一个级别上进行压缩并获取详细信息总计。 "second" 阶段所做的就是将现在已经对 "model" 唯一的内容折叠成一个 "models" 数组,并将其他分组项目作为键。