Как преобразовать запрос, основанный на mongodb, в скрипт pymongo на python? - PullRequest
0 голосов
/ 04 июня 2019

Я написал запрос mongodb, чтобы найти записи, чья дата начала менее 5 лет. Запрос хорошо работает в оболочке Монго.

db.userdetails.aggregate( [ {"$match":{"appid":"58d21f30d2a57d0ec807e012", "data.begin_date":{"$exists":"true"}}},
{ "$project": { "gender":"$data.gender", "birth_date":"$data.birth_date", 
    "membership_type":"$data.membership_type", "postal":"$data.postal", "begin_date":"$data.begin_date", 
    "begin_year":{"$year": "$data.begin_date"} } },
   { "$match": {"begin_year": {"$gt": new Date().getFullYear()-5}} } ] )

Теперь я хочу написать этот запрос для выполнения из python. Для этого я использовал библиотеку пимонго.

pipeline = [{"$match":{"appid":"58d21f30d2a57d0ec807e012", "data.begin_date":{"$exists":"true"}}},
            {"$project":{"gender":"$data.gender", "birth_date":"$data.birth_date",
                         "membership_type":"$data.membership_type", "postal":"$data.postal",
                         "begin_date":"$data.begin_date", "begin_year":{"$year": "$data.begin_date"} } },
            {"$match": {"begin_year": {"$gt": datetime.now().year-5}}}]

Из питона -

collection_userdetails.aggregate(pipeline)

Код показывает ошибку

**pymongo.errors.OperationFailure: can't convert from BSON type string to Date**

Я пытался выполнить запрос по частям, и после анализа begin_year ": {" $ year ":" $ data.begin_date "}} вызывает ошибку.

1 Ответ

0 голосов
/ 05 июня 2019

похоже, что как минимум один из документов имеет поле $ data.begin_date в виде строки, а не даты.

попробуйте что-то вроде:

   db.userdetails.find({"data.begin_date":{$type:2}})

, чтобы найти документы со строковым типом дляdata.begin_date

...