在PyMongo中使用带有$ project和aggregate的$ cond语句

时间:2015-05-25 14:20:19

标签: python mongodb pymongo

我想使用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'

我做错了什么?

2 个答案:

答案 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 queryaggregation query定义了单独的$eq运算符,它们的语法不同。

但是$in仅定义为常规查询。

如果您想将字段值与多个值进行比较,最好使用chridam's solution