105 votes

Rediriger la sortie d'une requête mongo vers un fichier csv

J'utilise MongoDB 2.2.2 sur une machine Windows7 32 bits. J'ai une requête d'agrégation complexe dans un fichier .js. Je dois exécuter ce fichier sur le shell et diriger la sortie vers un fichier CSV. Je m'assure que la requête renvoie un json "plat" (pas de clés imbriquées), de sorte qu'il est intrinsèquement convertible en un csv soigné.

Je suis au courant load() y eval() . eval() m'oblige à coller la requête entière dans le shell et ne permet qu'à printjson() à l'intérieur du script, alors que j'ai besoin de csv. Et, la deuxième façon : load() Il imprime la sortie à l'écran, et à nouveau au format json.

Existe-t-il un moyen pour Mongo d'effectuer cette conversion de json en csv (j'ai besoin du fichier csv pour préparer des graphiques sur les données). Je pense :

1. Soit Mongo a une commande intégrée pour cela que je n'arrive pas à trouver pour le moment.
2. Mongo ne peut pas le faire pour moi ; je peux tout au plus envoyer la sortie json vers un fichier que je dois ensuite convertir moi-même en csv.
3. Mongo peut envoyer la sortie json vers une collection temporaire, dont le contenu peut être facilement mongoexported au format csv. Mais je pense que seules les requêtes map-reduce prennent en charge les collections de sortie. Est-ce exact ? J'en ai besoin pour une requête d'agrégation.

Merci pour toute aide :)

200voto

GEverding Points 456

Je sais que cette question est ancienne mais j'ai passé une heure à essayer d'exporter une requête complexe au format csv et je voulais partager mes réflexions. Tout d'abord, je n'ai pu faire fonctionner aucun des convertisseurs json vers csv (bien que este l'un d'eux semblait prometteur). Ce que j'ai fini par faire, c'est écrire manuellement le fichier csv dans mon script mongo.

C'est une version simple mais c'est essentiellement ce que j'ai fait :

print("name,id,email");
db.User.find().forEach(function(user){
  print(user.name+","+user._id.valueOf()+","+user.email);
});

J'ai juste envoyé la requête à la sortie de l'ordinateur.

mongo test export.js > out.csv

donde test est le nom de la base de données que j'utilise.

130voto

thisarattr Points 1778

L'exportation intégrée de Mongo fonctionne bien, à moins que vous ne souhaitiez effectuer des manipulations de données comme le formatage de la date, la dissimulation des types de données, etc.

La commande suivante fonctionne comme un charme.

    mongoexport -h localhost -d databse -c collection --type=csv 
    --fields erpNum,orderId,time,status 
    -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
    --out report.csv

13voto

Lucky Soni Points 2579

Prolonger d'autres réponses :

J'ai trouvé la réponse de @GEverding plus souple. Elle fonctionne également avec l'agrégation :

test_db.js

print("name,email");

db.users.aggregate([
    { $match: {} }
]).forEach(function(user) {
        print(user.name+","+user.email);
    }
});

Exécutez la commande suivante pour exporter les résultats :

mongo test_db < ./test_db.js >> ./test_db.csv

Malheureusement, il ajoute du texte supplémentaire au fichier CSV, ce qui nécessite de traiter le fichier avant de pouvoir l'utiliser :

MongoDB shell version: 3.2.10 
connecting to: test_db

Mais nous pouvons faire en sorte que le shell mongo arrête de cracher ces commentaires et n'imprime que ce que nous avons demandé en passant l'option --quiet drapeau

mongo --quiet test_db < ./test_db.js >> ./test_db.csv

6voto

Shirish Kumar Points 146

Voici ce que vous pouvez essayer :

print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
    jsonObject = cursor.next();
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")

}

Sauvegardez-le dans un fichier, disons "export.js". Exécutez la commande suivante :

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv

5voto

geakie Points 1408

Jetez un coup d'œil à este

pour la sortie du shell mongo vers un fichier. Il n'y a pas de support pour la sortie csv à partir du shell mongos. Vous devrez écrire le javascript vous-même ou utiliser l'un des nombreux convertisseurs disponibles. Google "convert json to csv" par exemple.

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