2014-07-04 1 views
4

Donc j'essaie d'utiliser l'opérateur $ in à Pymongo où je veux faire des recherches avec un tas de MongoID.

Tout d'abord j'ai cette requête pour trouver un tableau de MongoIDs:

findUsers = db.users.find_one({'_id':user_id},{'_id':0, 'f':1}) 

Si j'imprimer la findUsers['f'] il ressemble à ceci:

[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')] 

Ces ID d'objet sont ids utilisateur et ce que je veux faire est de trouver tous les utilisateurs qui sont dans la collection des utilisateurs avec ce tableau d'ObjectID. Donc, ma pensée était la suivante:

foundUsers = db.users.find({'_id':{'$in':findUsers['f']}}) 

Cependant, lorsque j'imprimer les foundUsers le résultat est le suivant:

<pymongo.cursor.Cursor object at 0x10d972c50> 

qui n'est pas ce que je reçois normalement lorsque j'imprime une requête sur :(

Qu'est-ce que je fais mal ici?

Un grand merci.

également pour vous ref érence, je l'ai interrogé dans le shell mongo et il fonctionne comme prévu:

db.users.find({_id: {$in:[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]}}) 

Répondre

1

vous rencontrez la différence entre findOne() et FIND() dans MongoDB. findOne renvoie un seul document. find() renvoie un curseur mongoDB. Normalement, vous devez parcourir le curseur pour afficher les résultats. La raison pour laquelle votre code fonctionne dans le shell mongo est que le shell mongo traite les curseurs différemment en cas de retour de 20 documents ou moins - il itérer poignées sur le curseur pour vous:

Curseurs

Dans le mongo shell, la méthode principale pour l'opération de lecture est la méthode db.collection.find(). Cette méthode interroge une collection et renvoie un curseur aux documents renvoyés.

Pour accéder aux documents, vous devez répéter le curseur. Toutefois, dans le shell mongo, si le curseur renvoyé n'est pas affecté à une variable en utilisant le mot-clé var, le curseur est automatiquement itéré jusqu'à 20 fois [1] pour imprimer les 20 premiers documents dans les résultats.

http://docs.mongodb.org/manual/core/cursors/

La page de manuel pymongo sur Enumérer les curseurs serait probablement un bon endroit pour commencer:

http://api.mongodb.org/python/current/api/pymongo/cursor.html

mais est ici un morceau de code qui devrait illustrer les principes de base pour vous . Après votre appel pour trouver() exécuter ceci:

for doc in findUsers: 
    print(doc) 
+1

Merci beaucoup pour votre information! Maintenant, je comprends – jonprasetyo

+0

Pour convertir le curseur en une liste Python dès qu'il est retourné, enveloppez la requête dans une liste 'list' ...' users = (db.users.find()) ' – MFB