我想将聚合中的结果保存到csv文件中。
使用mongo cmd线工具我可以这样做以获得我想要的结果:
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
我如何将其转换为将结果保存到csv的mongoexport命令?
答案 0 :(得分:67)
2.6+中稍微简单的选项现在是向聚合添加$ out步骤以将结果放入集合中:
db.collection.aggregate( [ { aggregation steps... }, { $out : "results" } ] )
然后只使用mongoexport
mongoexport -d database -c results -f field1,field2,etc --csv > results.csv
之后,您可能希望从数据库中删除临时集合,这样它就不会继续使用不必要的资源,并且在您忘记数据库中存在此集合的原因时也可以避免混淆。
db.results.drop()
答案 1 :(得分:44)
您可以使用以下3个步骤导出到CSV文件:
将汇总结果分配给变量(reference):
var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
将变量的值插入新集合:
db.bar.insert(result.result);
在终端(或命令行)中将此栏集合导出为CSV文件:
mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv
......你已经完成了:)
答案 2 :(得分:12)
您无法通过mongoexport
运行aggregate()次查询。 mongoexport
工具旨在通过查询过滤器进行更基本的数据导出,而不是完全聚合和数据处理。不过,您可以使用您最喜欢的language driver为MongoDB轻松编写一个简短的脚本。
答案 3 :(得分:12)
如果您不想将结果存储在集合中,您还可以使用print函数直接从JavaScript写入CSV文件。将以下脚本保存到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
}
}
从命令行,调用
mongo server / collection exportCompras.js> comprasResults.csv --quiet
答案 4 :(得分:2)
采取以下措施并将其保存在某个地方的mongo服务器上:
// 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);
}
}
然后你可以通过shell或像Robomongo这样的GUI运行以下命令:
load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();
答案 5 :(得分:2)
按照我的逻辑,我希望将输出作为JSON数据输出到 out.json
1-在本地而不是在服务器上创建 file.js
dfs
2-运行
date = new Date("2019-09-01");
query = {x: true, 'created': {$gte: date}};
now = new Date();
userQuery = {'user.email': {$nin: [/\.dev$|@test\.com$|@testing\.com$/]}};
data = db.companies.aggregate([
{$match: query},
{$sort: {x: 1, created: 1}},
{$lookup: {as: 'user', from: 'users', localField: 'creator', foreignField: '_id'}},
{$addFields: {user: {$arrayElemAt: ['$user', 0]}}},
{$match: userQuery},
{$project: {"_id": 1, "name": 1, "user.email": 1, "xyz": 1}}
]).toArray();
print(JSON.stringify(data));
3-删除标题并检查 out.json
mongo server/collection file.js > out.json --quiet
答案 6 :(得分:0)
尝试此查询-
mongoexport -d DataBase_Name -c Collection_Name --type=csv --fields name,phone,email -q '{_bank:true,"bank.ifsc":{$regex:/YESB/i}}' --out report.csv