IfNull with Zero值为Boolean False。怎么算?

时间:2017-07-05 13:06:04

标签: python mongodb mongodb-query aggregation-framework pymongo

编辑:更明确的例子

我想计算集合中某个特定字段的值的数量。

chosenSensors = ["CO2_BUR_NE_I_001", "CO2_CEL_SE_I_001"]

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':['$'+chosenSensor, False]}, 1, 0]}}
project['$project'][chosenSensor+'-Count'] = True


sort = {'$sort': {"_id":1}}

pipeline = [match, group, project, sort]

for doc in client["cleanData"]["test"].aggregate(pipeline):
    print(doc)

下面是我收藏的一个样本。我想计算 CO2_BUR_NE_I_001中的值数。

我希望得到4分。

example with 0

{
    "_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" : 0
}

{
    "_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
}

{
    "_id" : ObjectId("593ab6025ccb9b0c0fb226fd"),
    "timestamp" : ISODate("2016-11-17T12:36:00.000Z"),
    "TEM_ETG_001" : 1210
}

但我 3 CO2_CEL_SE_I_001 的值 0 不计入现有值。

{'_id': {'year': 2016}, 'CO2_BUR_NE_I_001-Count': 3, 'CO2_CEL_SE_I_001-Count': 5}

如果我在相关文件中将 0 替换为 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': {'year': 2016}, 'CO2_BUR_NE_I_001-Count': 4, 'CO2_CEL_SE_I_001-Count': 5}

编辑:开始回答......

当我对存在的值使用$ ifNull时,它返回值。但是,当该值为0时,它返回0.但是这个返回给予$ cond,当它为0时,$ cond被认为是False,它返回0而不是1到我的$ sum。我该怎么处理?

2 个答案:

答案 0 :(得分:0)

计算集合中某个特定字段的值数。

您可以使用db.collection.distinct()从mongodb获取不同的值,然后查找列表长度,无需聚合。

values = db.collection.distinct('field',{Conditions})
print(len(values))

答案 1 :(得分:0)

在BSON类型值的比较顺序中,该方法使用的事实比Null低于数字(int,double,long): Documentation : comparison/Sort Order

所以我只需要将我的值与无比值进行比较。

{'$sum':{'$cond':[{ '$gt': ['$'+chosenSensor, None]}, 1, 0]}}