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?
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.
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()
Vous pouvez exporter vers un fichier CSV en suivant les 3 étapes suivantes:
Attribuez vos résultats d'agrégation à une variable ( référence ):
var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
Insérez une valeur de la variable dans une nouvelle collection:
db.bar.insert(result.result);
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 :)
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
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();