web-dev-qa-db-fra.com

Pymongo: itère sur tous les documents de la collection

J'utilise PyMongo et j'essaie d'itérer plus de (10 millions) de documents dans ma collection MongoDB et d'extraire juste quelques clés: "nom" et "adresse", puis de les exporter vers un fichier .csv.

Je ne peux pas trouver la bonne syntaxe pour le faire avec find (). ForEach ()

J'essayais des solutions de contournement comme

   cursor = db.myCollection.find({"name": {$regex: REGEX}})

où REGEX correspondrait à tout - et cela a abouti à "Killed". J'ai aussi essayé

   cursor = db.myCollection.find({"name": {"$exist": True}})

mais cela n'a pas fonctionné non plus.

Aucune suggestion?

9
mel

Je ne peux pas trouver la bonne syntaxe pour le faire avec find (). ForEach ()

cursor.forEach () n'est pas disponible pour Python, c'est une fonction JavaScript. Vous devriez avoir un curseur et le parcourir. Voir Tutoriel PyMongo: interroger plusieurs documents , où vous pouvez faire:

for document in myCollection.find():
    print(document) # iterate the cursor

où REGEX correspondrait à tout - et cela a abouti à "Killed".

Malheureusement, il y a un manque d'informations ici pour déboguer sur pourquoi et ce qu'est 'Killed'. Bien que si vous souhaitez tout faire correspondre, vous pouvez simplement déclarer:

cursor = db.myCollection.find({"name": {$regex: /.*/}}) 

Étant donné que le champ name contient des valeurs de chaîne. Bien que vous utilisiez $exists pour vérifier si le champ name existe serait préférable à l'utilisation de regex.

Bien que l'utilisation de l'opérateur $ existe dans votre exemple ci-dessus soit incorrecte. Vous manquez un s dans $exists. Encore une fois, malheureusement, nous ne savons pas beaucoup d'informations sur ce qui "ne fonctionnait pas" signifiait pour aider au débogage.

Si vous écrivez ce script pour Python, je recommanderais de revoir:

Vous pouvez également vous inscrire à un cours en ligne gratuit à MongoDB University for M101P: MongoDB for Python Developers .

Cependant, si vous essayez simplement d'accomplir votre tâche d'exportation de CSV à partir d'une collection. Comme alternative, vous pouvez simplement utiliser mongoexport de MongoDB. Qui a le support pour:

Voir tilisation de mongoexport pour plus d'informations.

7
Wan Bachtiar

La méthode find() renvoie un curseur PyMongo, qui fait référence au jeu de résultats d'une requête.

Vous devez dé-référence, en quelque sorte, la référence (adresse).

Après cela, vous comprendrez mieux comment manipuler/gérer le curseur.

Essayez ce qui suit pour commencer:

result = db.*collection_name*.find()
print(list(result)) 
0
Confidenc3

Je n'ai pas eu de chance avec .find (). ForEach () non plus, mais cela devrait trouver ce que vous cherchez et l'imprimer.

Tout d'abord trouvez tous les documents qui correspondent à ce que vous recherchez

cursors = db.myCollection.find({"name": {$regex: REGEX}})

puis itérer sur les correspondances

for cursor in cursors
    print(cursor.get("name"))
0
GodIsAnAstronaut