web-dev-qa-db-fra.com

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

J'utilise MongoDB 2.2.2 pour 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 retourne un json "plat" (pas de clés imbriquées), de sorte qu'il est intrinsèquement convertible en un csv soigné.

Je connais load() et eval(). eval() nécessite que je colle toute la requête dans le shell et n'autorise que printjson() à l'intérieur du script, alors que j'ai besoin de CSV. Et, la deuxième façon: load() .. Il imprime la sortie sur l'écran, et encore au format json.

Est-il possible que Mongo réalise cette conversion de json en csv? (J'ai besoin d'un fichier csv pour préparer des graphiques sur les données). Je suis en train de penser:

1. Soit mongo a une commande intégrée pour cela que je ne peux pas trouver pour le moment.
2. Mongo ne peut pas le faire pour moi; Je peux tout au plus envoyer la sortie JSON dans un fichier que je dois ensuite convertir moi-même en CSV.
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 de réduction de carte prennent en charge les collections de sortie. Est-ce correct? J'en ai besoin pour une requête d'agrégation.

Merci pour toute aide :)

71
Aafreen Sheikh

Je sais que cette question est ancienne, mais je passe une heure à essayer d’exporter une requête complexe au format CSV et je souhaite partager mes réflexions. Premièrement, je ne pouvais obtenir aucun des convertisseurs JSON en CSV fonctionner (bien que ceci un semblait prometteur). J'ai fini par écrire manuellement le fichier csv dans mon script mongo.

Ceci 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 requête à stdout

mongo test export.js > out.csv

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

147
GEverding

L'exportation intégrée de Mongo fonctionne correctement, à moins que vous ne souhaitiez manipuler des données telles que le formatage, les types de données cachés, etc.

Suivre la commande 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
89
thisarattr

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 cela dans un fichier, dites "export.js". Exécutez la commande suivante:

mongo <Host>/<dbname> -u <username> -p <password> export.js > out.csv
6
Shirish Kumar

Prolonger d'autres réponses:

J'ai trouvé la réponse de @ GEverding la plus flexible. Cela fonctionne aussi 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 son traitement avant de pouvoir l'utiliser:

MongoDB Shell version: 3.2.10 
connecting to: test_db

Mais nous pouvons faire en sorte que Shell Shell arrête de cracher ces commentaires et d’imprimer ce que nous avons demandé en passant le --quiet drapeau

mongo --quiet test_db < ./test_db.js >> ./test_db.csv
5
Lucky Soni

Regardez this

pour sortir de mongo Shell dans un fichier. Il n’ya pas de support pour la sortie de csv de mongos Shell. Vous devrez écrire le javascript vous-même ou utiliser l’un des nombreux convertisseurs disponibles. Google "convertit json en csv" par exemple.

5
geakie