PYMONGO — Как мне использовать оператор запроса $ in с монгоидами?

#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())