#python #mongodb #pymongo #mongodb-query
#python #mongodb #pymongo #mongodb-запрос
Вопрос:
Итак, я пытаюсь использовать оператор $ in в Pymongo, где я хочу выполнить поиск с помощью множества монгоидов.
Сначала у меня есть этот запрос, чтобы найти массив монгоидов:
findUsers = db.users.find_one({'_id':user_id},{'_id':0, 'f':1})
Если я напечатаю findUsers['f']
, это будет выглядеть следующим образом:
[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]
Эти идентификаторы объектов являются идентификаторами пользователей, и что я хочу сделать, так это найти всех пользователей, которые находятся в коллекции users, с этим массивом ObjectId. Итак, моя мысль была такой:
foundUsers = db.users.find({'_id':{'$in':findUsers['f']}})
Однако, когда я печатаю foundUsers, результат таков:
<pymongo.cursor.Cursor object at 0x10d972c50>
это не то, что я обычно получаю при распечатке запроса: (
Что я здесь делаю не так?
Большое спасибо.
Также, просто для справки, я запросил в оболочке mongo, и это работает, как ожидалось:
db.users.find({_id: {$in:[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]}})
Ответ №1:
Вы столкнулись с разницей между findOne() и find() в MongoDB. findOne возвращает один документ. find() возвращает курсор MongoDB. Обычно вам приходится выполнять итерации по курсору, чтобы показать результаты. Причина, по которой ваш код работает в оболочке mongo, заключается в том, что оболочка mongo по-разному обрабатывает курсоры, если они возвращают 20 документов или меньше — она обрабатывает итерацию курсора за вас:
Курсоры
В оболочке mongo основным методом для операции чтения является метод db.collection.find(). Этот метод запрашивает коллекцию и возвращает курсор к возвращаемым документам.
Чтобы получить доступ к документам, вам нужно выполнить итерацию курсора. Однако в командной оболочке mongo, если возвращаемый курсор не назначен переменной с использованием ключевого слова var, курсор автоматически повторяется до 20 раз [1] для печати до первых 20 документов в результатах.
http://docs.mongodb.org/manual/core/cursors/
Страница руководства pymongo по перебору курсоров, вероятно, была бы хорошим местом для начала:
http://api.mongodb.org/python/current/api/pymongo/cursor.html
но вот фрагмент кода, который должен проиллюстрировать основы для вас. После вашего вызова find() запустите это:
for doc in findUsers:
print(doc)
Комментарии:
1. Чтобы преобразовать курсор в список Python, как только он будет возвращен, оберните запрос в
list
…users = list(db.users.find())