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。我该如何处理呢?但这只会返回一次具有相同值的文档,这不是我想要的,因为它只会对一些相同的值计数一次。但这只会返回一次具有相同值的文档,这不是我想要的,因为它只对一些相同的值计数一次。