Использование оператора $cond с $project и агрегатом в PyMongo

Я хочу создать новое поле на основе оператора условной логики, используя pymongo.

Значение должно быть равно 1, если в поле 'status' указано значение 'successful_Завершено' или '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'

Что я сделал не так?


person ninjaPixel    schedule 25.05.2015    source источник
comment
Вы уверены, что $eq работает? вы сравниваете с 'status', разве не должно быть '$status'?   -  person bagrat    schedule 25.05.2015
comment
Да, меня это тоже удивило! Работает как с status, так и с $status   -  person ninjaPixel    schedule 25.05.2015
comment
Ты уверен? Потому что, что бы вы сделали, если бы у вас было поле status, но вы хотели бы сравнить его значение со строкой 'status'?   -  person bagrat    schedule 25.05.2015


Ответы (2)


Вместо этого используйте оператор $or, который оценивает одно или несколько выражений и возвращает true, если хотя бы одно из выражений истинно. В противном случае $or возвращает false. Таким образом, поле successful_2 можно спроецировать как:

'successful_2': {
    '$cond': [ 
        { 
            '$or': [ 
                { '$eq': [ '$status', 'successful_ended' ] }, 
                { '$eq': [ '$status', 'successful_ongoing' ] } 
            ]
        }     
        , 1, 0 
    ]
}
person chridam    schedule 25.05.2015

Проблема в том, что для платформы агрегации не определен оператор $in.

Как видите, для обычных запросов$eq. > и запрос агрегации, и их синтаксис отличается.

Однако $in определяется только для обычного запроса.

Если вы хотите сравнить значение поля с несколькими значениями, вам лучше использовать решение chridam

person bagrat    schedule 25.05.2015