我试图获得文档中某些字段的现有值的计数,以便为每年的数据计算这些值的平均值。因为我们注意到(in previous question)在我的案例中不能使用$avg聚合,所以我们决定使用sum/count操作
以下是数据示例:
{
"_id" : ObjectId("593ab6021ccb9b0c0fb226fd"),
"timestamp" : ISODate("2016-11-17T12:36:00.000Z"),
"CO2_CEL_SE_I_001" : 1210,
"CO2_BUR_NE_I_001" : 880
}
{
"_id" : ObjectId("593ab6021ccb9b0c0fb226fe"),
"timestamp" : ISODate("2016-11-17T12:37:00.000Z"),
"CO2_CEL_SE_I_001" : 1210,
"CO2_BUR_NE_I_001" : 880
}
{
"_id" : ObjectId("593ab6021ccb9b0c0fb226ff"),
"timestamp" : ISODate("2016-11-17T12:38:00.000Z"),
"CO2_CEL_SE_I_001" : 1210,
"CO2_BUR_NE_I_001" : 880
}
{
"_id" : ObjectId("593ab63a1ccb9b0c0fb3d3e5"),
"timestamp" : ISODate("2016-02-01T19:26:00.000Z"),
"CO2_CEL_SE_I_001" : 1080
}
{
"_id" : ObjectId("593ab6021ccb9b0c0fb22700"),
"timestamp" : ISODate("2016-11-17T12:39:00.000Z"),
"CO2_CEL_SE_I_001" : 1210,
"CO2_BUR_NE_I_001" : 880
}
然而,得到的结果似乎不是我所期望的。下面是我的问题:
match = {'$match':{'$or':list(map(lambda x:{x:{'$exists': True}}, chosenSensors))}}
group = {'$group':{'_id':{'year':{'$year':'$timestamp'}}}}
project = {'$project':{}}
for chosenSensor in chosenSensors:
group['$group'][chosenSensor+'-Count'] = {'$sum':{'$cond':[{'$ifNull':[True, False]}, 1, 0]}}
group['$group'][chosenSensor+'-Sum'] = {'$sum':{'$ifNull':['$'+chosenSensor, 0]}}
project['$project'][chosenSensor+'-Avg'] = {'$divide':['$'+chosenSensor+'-Sum', '$'+chosenSensor+'-Count']}
project['$project'][chosenSensor+'-Count'] = True
project['$project'][chosenSensor+'-Sum'] = True
sort = {'$sort': {"_id":1}}
pipeline = [match, group, project, sort]
for doc in client["cleanData"]["maison2"].aggregate(pipeline):
print(doc)
下面是我的结果:
Chosensors=[“CO2\u BUR\u NE\u I u 001”,“CO2\u CEL\u SE\u I u 001”]
{'_id': {'year': 2016}, 'CO2_BUR_NE_I_001-Count': 5, 'CO2_BUR_NE_I_001-Sum': 3520, 'CO2_CEL_SE_I_001-Count': 5, 'CO2_CEL_SE_I_001-Sum': 5920, 'CO2_BUR_NE_I_001-Avg': 704.0, 'CO2_CEL_SE_I_001-Avg': 1184.0}
chosenSensors=[“CO2\u BUR\u NE\u I\u 001”]
{'_id': {'year': 2016}, 'CO2_BUR_NE_I_001-Count': 4, 'CO2_BUR_NE_I_001-Sum': 3520, 'CO2_BUR_NE_I_001-Avg': 880.0}
chosenSensors=[“CO2\u CEL\u SE\u I\u 001”]
{'_id': {'year': 2016}, 'CO2_CEL_SE_I_001-Count': 5, 'CO2_CEL_SE_I_001-Sum': 5920, 'CO2_CEL_SE_I_001-Avg': 1184.0}
查询的行为很奇怪。当我在Chosensor中定义多个元素的数组时,每个字段的计数似乎是最后一个字段计数的结果。当定义的数组由单个元素合成时,计数是正确的
你误解了我在你自己的翻译中给你的代码
因此:
应该是:
因为你写的东西要求
$ifNull
计算始终存在的True
的布尔值,而不是当前“字段”的正确表达式,我们需要测试它是否存在所以发生的事情是,字段“总是”被计数,这当然是我们试图避免的“平均”问题
相关问题 更多 >
编程相关推荐