我想使用pymongo基于条件逻辑语句来设计一个新字段。
如果' status' 字段是' successful_ended' 或&#39>,则该值应等于1 ; successful_ongoing' 。我尝试在$in
语句中使用$cond
来实现此功能。我的聚合语句的简化版本如下:
pipeline = [
{'$project': {'platform':1, 'platform_id':1, 'funding_type':1, 'raised_usd':1, 'status':1,
'successful_1': # an equals statement works
{
'$cond':[{'$eq':['status', 'successful_ended']}, 1, 0]
},
'successful_2': # but this fails
{
'$cond':[{'status': {'$in': ['successful_ended', 'successful_ongoing']}}, 1, 0]
}
}
}
]
result = db.projects.aggregate(pipeline)
它失败并显示消息:
invalid operator '$in'
我做错了什么?
答案 0 :(得分:3)
使用$or
运算符代替计算一个或多个表达式,如果任何表达式为true,则返回true。否则,$or
返回false。因此,successful_2
字段可以投影为:
'successful_2': {
'$cond': [
{
'$or': [
{ '$eq': [ '$status', 'successful_ended' ] },
{ '$eq': [ '$status', 'successful_ongoing' ] }
]
}
, 1, 0
]
}
答案 1 :(得分:1)
问题在于没有为聚合框架定义$in
运算符。
正如您所看到的,为regular query和aggregation query定义了单独的$eq
运算符,它们的语法不同。
但是$in
仅定义为常规查询。
如果您想将字段值与多个值进行比较,最好使用chridam's solution