Rediriger la sortie de la requête mongo vers un fichier csv

J'utilise MongoDB 2.2.2 Pour Machine Windows7 32 bits. J'ai une requête d'agrégation complexe en a.fichier js. J'ai besoin d'exécuter ce fichier sur la coque et de diriger la sortie vers un fichier CSV. Je m'assure que la requête retourne un JSON "plat" (aucune clé imbriquée), il est donc intrinsèquement convertible en un csv soigné.



Je connais load() et eval() . eval() me demande de coller l'ensemble de la requête dans le shell et ne permet que printjson() dans le script, pendant que j'ai besoin de csv. Et, la deuxième façon: load() .. il imprime la sortie sur l'écran, et encore dans le format json.



Y a-t-il un moyen pour que Mongo puisse faire cette conversion de json en csv? (J'ai besoin du fichier csv pour préparer des graphiques sur les données). J ' axerai:



1. Soit mongo a une commande intégrée pour ça que je ne peux pas trouver maintenant.

2. Mongo ne peut pas le faire il pour moi; je peux tout au plus envoyer la sortie json à un fichier que je dois ensuite convertir en csv moi-même.

3. Mongo peut envoyer la sortie json à une collection temporaire, dont le contenu peut être facilement mongoexported au format csv. Mais je pense que seules les requêtes map-reduce supportent les collections de sorties. Est ce que le droit? J'en ai besoin pour une agrégation de requête.

Merci pour toute aide:)

59
demandé sur Aafreen Sheikh 2013-01-23 15:12:16

5 réponses

je sais que cette question Est ancienne mais je passe une heure à essayer d'exporter une requête complexe à csv et je voulais partager mes pensées. Tout d'abord, je n'ai pas pu faire fonctionner les convertisseurs JSON to csv (bien que ce semblait prometteur). Ce que j'ai fini par faire était d'écrire manuellement le fichier csv dans mon script mongo.

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

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

je viens de passer la question à stdout

mongo test export.js > out.csv

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

132
répondu GEverding 2016-01-18 14:42:46

Mongo's in-built export fonctionne très bien, à moins que vous ne vouliez à n'importe quelle manipulation de données comme la date de format, les types de données cachés etc.

suivant la commande fonctionne comme le charme.

mongoexport -h localhost -d databse -c collection --csv 
--fields erpNum,orderId,time,status 
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
--out report.csv
66
répondu thisarattr 2017-06-21 16:39:07

regardez ce

pour sortie de Mongo shell à file. Il n'y a pas de support pour l'outputing csv de mongos shell. Vous devez écrire le javascript vous-même ou utiliser l'un des nombreux convertisseurs disponibles. Google "convertir json en csv" par exemple.

5
répondu geakie 2017-05-23 11:47:28

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() +"\"")

}

enregistrez ça dans un fichier, dites "exporter".js". Exécutez la commande suivante:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv
5
répondu Shirish Kumar 2014-07-17 20:13:58

réponses complémentaires:

j'ai trouvé la réponse de @GEverding la plus flexible. Il 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 qui nécessite le traitement du fichier avant que nous puissions l'utiliser:

MongoDB shell version: 3.2.10 
connecting to: test_db

But nous pouvons faire Mongo shell arrêter de cracher ces commentaires et seulement imprimer ce que nous avons demandé en passant le --quiet drapeau

mongo --quiet test_db < ./test_db.js >> ./test_db.csv
5
répondu Lucky Soni 2017-08-01 12:52:16