集合中每个字段的现有值计数,奇怪的行为

2024-06-17 12:04:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图获得文档中某些字段的现有值的计数,以便为每年的数据计算这些值的平均值。因为我们注意到(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中定义多个元素的数组时,每个字段的计数似乎是最后一个字段计数的结果。当定义的数组由单个元素合成时,计数是正确的


Tags: projectidcountgroupyeartimestampnesum
1条回答
网友
1楼 · 发布于 2024-06-17 12:04:42

你误解了我在你自己的翻译中给你的代码

因此:

group['$group'][chosenSensor+'-Count'] =
  {'$sum':{'$cond':[{'$ifNull':[True, False]}, 1, 0]}}

应该是:

group['$group'][chosenSensor+'-Count'] = {
  {'$sum':{'$cond':[{'$ifNull':['$'+chosenSensor, False]}, 1, 0]}

因为你写的东西要求$ifNull计算始终存在的True的布尔值,而不是当前“字段”的正确表达式,我们需要测试它是否存在

所以发生的事情是,字段“总是”被计数,这当然是我们试图避免的“平均”问题

相关问题 更多 >