Python 值为零的IfNull为布尔值False。如何计算?

Python 值为零的IfNull为布尔值False。如何计算?,python,mongodb,mongodb-query,aggregation-framework,pymongo,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 = {'$proje

编辑:更明确的示例

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

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

但是我有三个。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而不是我的$sum的1。如何处理此问题?

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

您可以使用从mongodb获取不同的值,然后查找列表的长度,而无需聚合

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

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

您可以使用从mongodb获取不同的值,然后查找列表的长度,而无需聚合

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

该方法在BSON类型值的比较顺序中使用than Null小于数字(int、doubles、long)这一事实:

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

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

该方法在BSON类型值的比较顺序中使用than Null小于数字(int、doubles、long)这一事实:

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

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

字段“始终”存在。您的意思肯定是“大于0时计数”。因此,我的问题不是很好,而不是
$ifNull
。我会想办法改进它。@NeilLunn我已经编辑了我的问题。我有一部分答案。当我对存在的值使用$ifNull时,它返回值。但是,当该值为0时,它返回0。但是这个返回是给$cond的,当它为0时,$cond被认为是False,它返回0而不是我的$sum的1。我怎么处理?字段“始终”存在。您的意思肯定是“大于0时计数”。因此,我的问题不是很好,而不是
$ifNull
。我会想办法改进它。@NeilLunn我已经编辑了我的问题。我有一部分答案。当我对存在的值使用$ifNull时,它返回值。但是,当该值为0时,它返回0。但是这个返回是给$cond的,当它为0时,$cond被认为是False,它返回0而不是我的$sum的1。我该如何处理呢?但这只会返回一次具有相同值的文档,这不是我想要的,因为它只会对一些相同的值计数一次。但这只会返回一次具有相同值的文档,这不是我想要的,因为它只对一些相同的值计数一次。