Използване на израза $cond с $project и aggregate в PyMongo

Искам да проектирам ново поле въз основа на условен логически израз, използвайки pymongo.

Стойността трябва да е равна на 1, ако полето 'status' е 'successful_ended' или '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, който оценява един или повече изрази и връща истина, ако някой от изразите е верен. В противен случай $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