55 votes

Opérations d'écriture de fichiers dans mongo script ?

Est-il possible d'écrire le résultat de la requête dans le fichier à partir de mongo js script. J'ai beaucoup cherché, mais je n'ai pas trouvé de solution.

ex:-

cursor = db.users.find();

while(cursor.hasNext()) {
  cursor.next();
  // writing the cursor output to file ????<br/>
}

1 votes

Btw, si vous iterez toujours la collection entière, il est plus efficace d'utiliser mongodump. utiliser un script est plus flexible, vous pouvez faire toutes sortes de traitements avant d'imprimer les résultats.

0 votes

Plus sur mongodump

84voto

milan Points 4210

Vous pourriez utiliser print et ensuite rediriger la sortie :

script.js :

cursor = db.users.find();
while(cursor.hasNext()){
    printjson(cursor.next());
}

puis exécuter le script et rediriger la sortie vers un fichier :

mongo --quiet script.js > result.txt

1 votes

Oui, c'est possible. Mais j'essaie d'exécuter le script comme démon. Donc je n'ai demandé que des opérations d'écriture de fichiers. merci.

0 votes

La sortie du processus daemon peut également être redirigée vers un fichier. Vous pourriez écrire un shell script autour de lui, pour invoquer mongo sur demo.js et rediriger vers un fichier.

1 votes

Comment puis-je spécifier quelle base de données le script doit utiliser ?

22voto

Roman Ivanov Points 647

http://www.mongodb.org/display/DOCS/Scripting+la+coquille paragraphe "Différences entre scripts et interactifs/ Impression".

./mongo server.com/mydb --quiet --eval "db.users.find().forEach(printjson);" > 1.txt

0 votes

Cette approche est délicate si vous voulez placer une requête à l'intérieur du find(), en raison de l'échappement des caractères. Dans ce cas, il est préférable d'utiliser la réponse de @milan ci-dessus avec un fichier de requête séparé.

0 votes

@AndrewL Pouvez-vous utiliser des guillemets simples à la place ? Je pense que c'est censé ne pas faire autant d'échappement ou quelque chose comme ça, non ?

0 votes

Pour imprimer certains champs/format personnalisé, utilisez : ".forEach( function(d) { print( d.id ) ; } ) ;".

15voto

fernandohur Points 899

Lorsque j'ai besoin d'écrire le résultat d'une requête mongo dans un fichier local, j'utilise généralement la fonction writeFile(pathToFile, stringContents) fonction.

Exemple : disons que vous devez rapidement trouver l'adresse électronique de tous les utilisateurs enregistrés et l'envoyer à votre ami Jim du département marketing.

$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password 
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.json", tojson(emails))

ou si Jim attend un fichier CSV alors

$ mongo mongodb://my-fancy-mongo-server --ssl -u fancy_username -p fancy_password 
successfully connected to my-fancy-mongo-server!
> emails = db.users.distinct('email_address')
> writeFile("jims_email_list.csv", emails.join("\n"))

Vous pouvez maintenant envoyer la liste d'emails à Jim et sauver la journée !

Les points importants à noter concernant le writeFile fonction :

  1. Le deuxième argument doit être une chaîne de caractères.
  2. Le premier argument doit être un fichier qui n'existe pas déjà, sinon vous obtiendrez une erreur.

14voto

Oubenal Mohcine Points 136

Vous pouvez sauter la boucle while en utilisant forEach() :

db.users.find().forEach(printjson);

7 votes

Encore plus compact : db.users.find().forEach(printjson) ;

3voto

Darren Newton Points 1352

Ne serait-il pas plus simple d'utiliser l'un des éléments suivants Pilotes Mongo pour un langage général (tel que Python, Ruby, Java, etc.) et écrire vos résultats dans un fichier de cette façon, dans un format que vous pouvez utiliser (tel que CSV, etc.) ?

UPDATE : Selon la documentation de mongodump vous pouvez exporter une collection avec une requête :

$ ./mongodump --db blog --collection posts
-q '{"created_at" : { "$gte" : {"$date" : 1293868800000},
                      "$lt"  : {"$date" : 1296460800000}
                    }
    }'

Cependant, vous devrez réimporter cette collection dans MongoDB pour l'exploiter ou utiliser la fonction mongoexport pour exporter en JSON ou CSV en utilisant le même drapeau de requête ( -q ) comme mongodump .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X