web-dev-qa-db-fra.com

exportation agrégée mongoexport vers un fichier csv

Je veux enregistrer le résultat d'une agrégation dans un fichier csv.

En utilisant l'outil de ligne mongo cmd, je peux le faire pour obtenir les résultats que je souhaite:

db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}

Comment pourrais-je traduire cela en une commande mongoexport qui enregistre les résultats dans un csv?

35
Baconator507

Vous ne pouvez pas exécuter les requêtes greg () via mongoexport. L'outil mongoexport est destiné à l'exportation de données plus basique avec un filtre de requête plutôt qu'à une agrégation complète et au traitement des données. Vous pouvez facilement écrire un court script en utilisant votre favori pilote de langue pour MongoDB, cependant.

12
Stennie

L'option légèrement plus simple à partir de 2.6+ consiste à ajouter maintenant une étape $ out à votre agrégat pour mettre les résultats dans une collection:

db.collection.aggregate( [ { aggregation steps... }, { $out : "results" } ] )

Ensuite, utilisez simplement mongoexport

mongoexport -d database -c results -f field1,field2,etc --csv > results.csv

Après cela, vous souhaiterez peut-être supprimer la collection temporaire de la base de données, afin qu'elle ne continue pas à utiliser des ressources inutiles, et également pour éviter toute confusion plus tard, lorsque vous avez oublié pourquoi cette collection existe dans votre base de données.

db.results.drop()
77
Matt

Vous pouvez exporter vers un fichier CSV en suivant les 3 étapes suivantes:

  1. Attribuez vos résultats d'agrégation à une variable ( référence ):

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
    
  2. Insérez une valeur de la variable dans une nouvelle collection:

    db.bar.insert(result.result);
    
  3. Dans le terminal (ou la ligne de commande), exportez cette collection de barres vers un fichier CSV:

    mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv
    

...et tu as fini :)

44
Askar

Si vous ne souhaitez pas stocker les résultats dans une collection, vous pouvez également écrire directement dans un fichier CSV à partir de JavaScript à l'aide de la fonction d'impression. Enregistrez le script suivant dans un fichier comme exportCompras.js.

var cursor = db.compras.aggregate({ $group : 
  { _id : "$data.proponente", 
    total : { $sum : "$price" }
  }
});

if (cursor && cursor.hasNext()) {

  //header
  print('proponente,total');

  while ( cursor.hasNext() ) {
    var item = cursor.next();
    print('"' + item._id + '",' + item.total);
    //printjson(cursor.next()); -- or if you prefer the JSON
  }

}

Depuis la ligne de commande, appelez

mongo server/collection exportCompras.js> comprasResults.csv --quiet

14
What Would Be Cool

Prenez ce qui suit et enregistrez-le sur le serveur mongo quelque part:

// Export to CSV function
DBCommandCursor.prototype.toCsv = function(deliminator, textQualifier) 
{
    var count = -1;
    var headers = [];
    var data = {};

    deliminator = deliminator == null ? ',' : deliminator;
    textQualifier = textQualifier == null ? '\"' : textQualifier;

    var cursor = this;

    while (cursor.hasNext()) {

        var array = new Array(cursor.next());

        count++;

        for (var index in array[0]) {
            if (headers.indexOf(index) == -1) {
                headers.Push(index);
            }
        }

        for (var i = 0; i < array.length; i++) {
            for (var index in array[i]) {
                data[count + '_' + index] = array[i][index];
            }
        }
    }

    var line = '';

    for (var index in headers) {
        line += textQualifier + headers[index] + textQualifier + deliminator;
    }

    line = line.slice(0, -1);
    print(line);

    for (var i = 0; i < count + 1; i++) {

        var line = '';
        var cell = '';
        for (var j = 0; j < headers.length; j++) {
            cell = data[i + '_' + headers[j]];
            if (cell == undefined) cell = '';
            line += textQualifier + cell + textQualifier + deliminator;
        }

        line = line.slice(0, -1);
        print(line);
    }
}

Ensuite, vous pouvez exécuter les commandes suivantes via le shell ou une interface graphique comme Robomongo:

load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();
3
Ian Newson