Python Mongodb метод поиска не работает - PullRequest
0 голосов
/ 15 мая 2018

Вот мой метод:

def mongo_find(collection_name, find_value):    
    list(MongoClient("localhost:27017").db[collection_name].find(find_value))


find_value = {'milestones.content': {'$regex': 'The idea'}}, {'milestones.content'}

print(list(mongo_find(collection_name, find_value)))

Я получаю эту ошибку:

TypeError: filter must be an instance of dict, bson.son.SON, or other type that inherits from collections.Mapping

но все работает нормально:

list(MongoClient("localhost:27017").db[collection_name].find({'milestones.content': {'$regex': 'The idea'}}, {'milestones.content'}))

Итак, при запуске метода mongo_find я попытался распечатать:

print(find_value)
({'milestones.content': {'$regex': 'The idea'}}, {'milestones.content'})

Возможно, потому что круглые скобки добавлены на обоих концах. Есть ли решение?

1 Ответ

0 голосов
/ 15 мая 2018

В вашем рабочем примере

list(MongoClient("localhost:27017").db[collection_name].find({'milestones.content': {'$regex': 'The idea'}}, {'milestones.content'}))

вы фактически передаете два параметра в функцию поиска. Первый тип dictionary и определяет фильтр

{'milestones.content': {'$regex': 'The idea'}}

в то время как второй является питоном set , который будет использоваться для проекции

{'milestones.content'}

Ваша нерабочая версия передает, но один параметр в метод find(), который является питоном кортеж (отсюда и взяты круглые скобки в вашем выводе), и выглядит вот так:

({'milestones.content': {'$regex': 'The idea'}}, {'milestones.content'})

Итак, чтобы исправить это, вы захотите передать два параметра, как в вашем рабочем примере:

def mongo_find(collection_name, filter. projection):
    list(MongoClient("localhost:27017").db[collection_name].find(filter, projection))

filter = {'milestones.content': {'$regex': 'The idea'}}
projection = {'milestones.content'}

print(list(mongo_find(collection_name, filter, projection)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...