如何使用 Robomongo 从 MongoDB 导出 JSON
Posted
技术标签:
【中文标题】如何使用 Robomongo 从 MongoDB 导出 JSON【英文标题】:How to export JSON from MongoDB using Robomongo 【发布时间】:2015-04-28 07:30:37 【问题描述】:所以我对MongoDB
了解不多。我有 RoboMongo
使用它连接到 MongoDB。我需要做的是——在那个 MongoDB 中有一个集合。我想从该集合中导出数据,以便将其保存到文件中。
我使用界面将集合中的数据作为文本打开,然后执行 Ctrl + A 并粘贴到文本文件中。但是,我发现并非所有数据都被复制,而且文本数据中有很多 cmets 自然会破坏 JSON。
我想知道 RoboMongo 是否有 Export As JSON
设施,以便我可以进行干净的导出。
任何指针表示赞赏!
【问题讨论】:
您要导出特定的集合或完整的数据库? 这不是 Robomongo 的当前功能,但我在 github 问题队列中添加了一个功能建议:Add JSON export。一般建议import/export should be integrated,但更详细/实用的用例会有所帮助。例如,这是否应该支持从集合、查找查询、聚合管道中导出 JSON?目前您最好的选择是使用标准的mongoexport
命令行工具。
@Stennie - 感谢您的评论。我想在回答您的问题时 - 从客户体验的角度来看,这并不重要。在大多数其他数据库接口中,流程是您运行查询(有或没有条件),获得一组结果。右键单击并说“将结果导出为...”所以这里应该同样适用。我是导出整个集合还是查找查询都没有关系。如果结果可以显示在面板中,那么它应该是可导出的。
只要你能做到这一点mongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
@Naren 右键单击->“导出为 JSON”会很简单。这不是。
【参考方案1】:
我不认为 robomongo 有这样的功能。 因此,您最好将 mongodb 函数用作特定 Collection 的 mongoexport。
http://docs.mongodb.org/manual/reference/program/mongoexport/#export-in-json-format
但如果您正在寻找备份解决方案,最好使用
mongodump / mongorestore
【讨论】:
【参考方案2】:目前有一些 MongoDB GUI,其中一些具有对数据导出的内置支持。您可以在 http://mongodb-tools.com
找到完整的 MongoDB GUI 列表您询问的是关于导出查询结果的问题,而不是关于导出整个集合的问题。试试3T MongoChef MongoDB GUI,此工具支持您的特定用例。
【讨论】:
Studio 3T 的工作比预期的要容易! :+1: Studio 3T 是完美的,但对于像我这样的独立开发者来说,它的成本过高。荒谬的成本。【参考方案3】:使用 robomongo shell 脚本:
//on the same db
var cursor = db.collectionname.find();
while (cursor.hasNext())
var record = cursor.next();
db.new_collectionname.save(record);
使用mongodb的导出导入命令
您可以将--jsonArray
参数/标志添加到您的mongoexport
命令中,这会将结果导出为单个json 数组。
然后在导入时再次指定--jsonArray
标志。
或删除文件中的开始和结束数组括号 [],然后您修改和导出的文件将使用 mongoimport
命令导入,而不带 --jsonArray
标志。
更多关于导出的信息:https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray
在此处导入: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray
【讨论】:
【参考方案4】:Robomongo 的 shell 功能将解决这个问题。就我而言,我需要几列作为 CSV 格式。
var cursor = db.getCollection('Member_details').find(Category: 'CUST',CustomerId :1,Name :1,_id:0)
while (cursor.hasNext())
var record = cursor.next();
print(record.CustomerID + "," + record.Name)
Output : -------
334, Harison
433, Rechard
453, Michel
533, Pal
【讨论】:
是否可以在 Robomongo shell 中将此脚本的输出写入本地 csv? 这给了我“脚本执行成功,但没有结果显示” 错误:第 10 行:分配中的左侧无效 这是一次获得 50 多条记录的最佳方式。我刚刚将打印切换到print(record)
,然后能够从文本视图中复制 json。【参考方案5】:
扩展 Anish 的答案,我想要一些可以应用于任何查询的东西,以自动输出所有字段,而不必在 print 语句中定义它们。它可能可以简化,但这是一种快速而肮脏的东西,效果很好:
var cursor = db.getCollection('foo').find(, bar: 1, baz: 1, created_at: 1, updated_at: 1).sort(created_at: -1, updated_at: -1);
while (cursor.hasNext())
var record = cursor.next();
var output = "";
for (var i in record)
output += record[i] + ",";
;
output = output.substring(0, output.length - 1);
print(output);
【讨论】:
【参考方案6】:您可以使用tojson
将每条记录转换为MongoDB shell script 中的JSON。
在 RoboMongo 中运行此脚本:
var cursor = db.getCollection('foo').find(, );
while(cursor.hasNext())
print(tojson(cursor.next()))
这会将所有结果打印为类似 JSON 的数组。
结果并不是真正的 JSON!某些类型(例如日期和对象 ID)被打印为 javascript 函数调用,例如 ISODate("2016-03-03T12:15:49.996Z")
。
对于大型结果集可能效率不高,但您可以限制查询。或者,您可以使用mongoexport
。
【讨论】:
它输出无效的 json。只是 json 序列化的记录一个一个 对于许多用例,可以使用tojson(db.getCollection(...).find(...)["_batch"])
输出从服务器获取的当前批次的全部内容。
@Yuval 你的意思是字面意思["_batch"]
?你能举例说明如何使用它吗?我用 Robo 3T 1.2.1 试过这个,但它只说“脚本执行成功,但没有结果显示”。
@FlorianWinter 这只是来自摆弄的随机发现。更好的解决方案是tojson(db.getCollection(...).find(...).toArray())
。
@Yuval 不错!那是最简单的解决方案,比我的要好得多。考虑将其发布为答案。 (或者编辑我的,但是我会得到你应得的所有荣誉,这有点不公平......)【参考方案7】:
不要在 shell 上运行此命令,在命令提示符下输入此脚本,并使用您的数据库名称、集合名称和文件名,全部替换占位符..
mongoexport --db (Database name) --collection (Collection Name) --out (File name).json
它对我有用。
【讨论】:
【参考方案8】:如果你想使用mongoimport,你需要这样导出:
db.getCollection('tables')
.find(_id: 'q3hrnnoKu2mnCL7kE')
.forEach(function(x)printjsononeline(x));
【讨论】:
【参考方案9】:我遇到了同样的问题,在 robomongo (Robo 3T 1.1.1) 中运行脚本也不允许复制值,也没有导出选项。 我能做到这一点的最好方法是使用 mongoexport,如果你的本地安装了 mongodb,你可以使用 mongoexport 连接到任何服务器上的数据库并提取数据
要连接到远程服务器上的数据和 csv 输出文件,请在命令行中运行以下 mongoexport
mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt
fieldFile: 有助于提取所需的列,例如: fields.txt 的内容可以是:
用户ID
只提取“userId”列的值
远程服务器上的数据,json输出文件:
mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json
这会将所有字段提取到 json 文件中
本地主机上的数据(mongodb 应该在本地主机上运行)
mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json
参考:https://docs.mongodb.com/manual/reference/program/mongoexport/#use
【讨论】:
【参考方案10】:您在电子表格中说“导出到文件”?喜欢 .csv?
IMO 这是在 Robo 3T(以前称为 robomongo)中执行此操作的最简单方法:
在 Robo 3T GUI 的右上角有一个“以文本形式查看结果 模式”按钮,单击它并复制所有内容
将所有内容粘贴到此网站:https://json-csv.com/
单击下载按钮,现在您将其保存在电子表格中。
希望这对某人有所帮助,因为我希望 Robo 3T 具有导出功能
【讨论】:
当我的 IntelliJ 数据连接中断时,这实际上帮助解决了我的问题。可悲的是,我不得不在 2021 年像这样跳槽,但是,嘿,它有效。谢谢! 这还将包括对象之间的 cmets,您需要在开头手动插入[
,在末尾插入 ]
。此外,您需要替换 ObjectID 和 ISODate 函数。【参考方案11】:
一种快速而肮脏的方法:只需将您的查询写为db.getCollection('collection').find().toArray()
,然后右键单击Copy JSON
。将数据粘贴到您选择的编辑器中。
【讨论】:
整洁!考虑到 robo3t 中缺少导出功能,一点也不脏。与其他建议的解决方案相比,小数据集更容易。 太棒了。正是我想要的 太棒了,对我有很大帮助,只是有点期待,我们可以一次导出整个集合。这个答案有助于导出单个表。 虽然日期将显示为 ISODate 而不是 8601 JSON 日期 太棒了!只是提醒一下 - 不要在大型集合或结果集上运行它:-)【参考方案12】:解决方案:
mongoexport --db test --collection traffic --out traffic.json<br><br>
地点: 数据库 -> 模拟服务器 集合名称 -> api_defs 输出文件名 -> childChoreRequest.json
【讨论】:
【参考方案13】:-
进行搜索
JSON 模式下的按钮视图结果
将结果复制到单词
从word中打印结果
【讨论】:
当我的文档中有日期时,它会返回不是有效 json 格式的 ISODate 元素。 为什么要使用 Word 文档来存储数据库导出?为什么世界上会有人想要打印数据库导出? @maesk ????【参考方案14】:Florian Winter 答案的扩展,适用于希望生成准备执行查询的人。
drop
和insertMany
使用cursor
查询:
// collection name
var collection_name = 'foo';
// query
var cursor = db.getCollection(collection_name).find();
// drop collection and insert script
print('db.' + collection_name + '.drop();');
print('db.' + collection_name + '.insertMany([');
// print documents
while(cursor.hasNext())
print(tojson(cursor.next()));
if (cursor.hasNext()) // add trailing "," if not last item
print(',');
// end script
print(']);');
它的输出会是这样的:
db.foo.drop();
db.foo.insertMany([
"_id" : ObjectId("abc"),
"name" : "foo"
,
"_id" : ObjectId("xyz"),
"name" : "bar"
]);
【讨论】:
【参考方案15】:简单的解决方案:
tostrictjson(db.getCollection(collection_name).find())
注意:
其他解决方案很好,但当您的集合具有 Date
、ObjectId
等类型时,可能会在导入过程中导致错误...
黑客愉快:)
【讨论】:
以上是关于如何使用 Robomongo 从 MongoDB 导出 JSON的主要内容,如果未能解决你的问题,请参考以下文章
当 MLAB 仅提供字符串 URI 时,有人如何将他们的 MLAB mongodb 数据库连接到 robomongo [重复]