将mongo查询的输出重定向到csv文件

Aaf*_*ikh 74 mongodb mongodb-query mongodb-.net-driver

我使用MongoDB 2.2.2 for 32位Windows7机器.我在.js文件中有一个复杂的聚合查询.我需要在shell上执行此文件并将输出定向到CSV文件.我确保查询返回一个"扁平"json(没有嵌套键),因此它本身可以转换为一个整洁的csv.

我知道load()eval().eval()要求我将整个查询粘贴到shell中,只允许printjson()在脚本内部,而我需要csv.并且,第二种方式:load()..它在屏幕上打印输出,并再次以json格式打印.

Mongo有没有办法从json转换到csv?(我需要csv文件来准备数据上的图表).我在想:

1.要么mongo有一个内置命令,我现在找不到.
蒙哥不能帮我做; 我最多可以将json输出发送到一个文件,然后我需要将其转换为csv.
3. Mongo可以将json输出发送到临时集合,其内容可以很容易地转换mongoexported为csv格式.但我认为只有map-reduce查询支持输出集合.是对的吗?我需要它来进行聚合查询.

谢谢你的帮助 :)

GEv*_*ing 151

我知道这个问题已经过时但我花了一个小时试图将复杂的查询导出到csv,我想分享我的想法.首先,我无法让任何json到csv转换器工作(虽然看起来很有希望).我最终做的是手动在我的mongo脚本中编写csv文件.

这是一个简单的版本,但基本上我做了:

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

这我只是将查询传递给stdout

mongo test export.js > out.csv
Run Code Online (Sandbox Code Playgroud)

test我使用的数据库的名称在哪里.

  • @NeluMalancea最后一个命令中的`test`**是数据库的名称,只需用数据库的名称替换它. (3认同)
  • @NeluMalancea查看他们拥有此信息的MongoDB [docs](http://docs.mongodb.org/manual/tutorial/getting-started-with-the-mongo-shell/).您可以通过在脚本顶部添加"use <database>"来指定数据库 (2认同)
  • 实际上,由于shell帮助程序(例如"use <database>")不是javascript,因此不允许使用它们.请参阅http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/.相反,启动你的脚本是这样的:conn = new Mongo(); db = conn.getDB('your_db_name'); (2认同)
  • @NeluMalancea mongo命令接受db url(和user,pass,...) (2认同)

thi*_*ttr 96

Mongo的内置导出工作正常,除非你想要任何数据操作,如格式日期,隐蔽数据类型等.

以下命令作为魅力.

    mongoexport -h localhost -d databse -c collection --type=csv 
    --fields erpNum,orderId,time,status 
    -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
    --out report.csv
Run Code Online (Sandbox Code Playgroud)

  • 万分感谢!提示:现在它是`--type = csv`而不是`--csv`. (16认同)
  • 我可以做聚合操作吗? (2认同)

Shi*_*mar 6

您可以尝试以下方法:

print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
    jsonObject = cursor.next();
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")

}
Run Code Online (Sandbox Code Playgroud)

将其保存在文件中,例如"export.js".运行以下命令:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv
Run Code Online (Sandbox Code Playgroud)


gea*_*kie 5

看看 这个

用于从mongo shell输出到文件.不支持从mongos shell输出csv.您必须自己编写JavaScript或使用众多可用的转换器之一.谷歌"将json转换为csv"为例.


Luc*_*oni 5

扩展其他答案:

我发现@ GEverding的答案最灵活.它也适用于聚合:

test_db.js

print("name,email");

db.users.aggregate([
    { $match: {} }
]).forEach(function(user) {
        print(user.name+","+user.email);
    }
});
Run Code Online (Sandbox Code Playgroud)

执行以下命令导出结果:

mongo test_db < ./test_db.js >> ./test_db.csv
Run Code Online (Sandbox Code Playgroud)

不幸的是,它在CSV文件中添加了额外的文本,需要先处理文件才能使用它:

MongoDB shell version: 3.2.10 
connecting to: test_db
Run Code Online (Sandbox Code Playgroud)

但是我们可以让mongo shell停止吐出那些评论,只打印我们通过传递--quiet旗帜所要求的内容

mongo --quiet test_db < ./test_db.js >> ./test_db.csv
Run Code Online (Sandbox Code Playgroud)