如何使用 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 答案的扩展,适用于希望生成准备执行查询的人。

dropinsertMany 使用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())

注意: 其他解决方案很好,但当您的集合具有 DateObjectId 等类型时,可能会在导入过程中导致错误...

黑客愉快:)

【讨论】:

以上是关于如何使用 Robomongo 从 MongoDB 导出 JSON的主要内容,如果未能解决你的问题,请参考以下文章

mogodb怎么用robomongo导出数据

从 ubuntu 卸载 mongoDB

当 MLAB 仅提供字符串 URI 时,有人如何将他们的 MLAB mongodb 数据库连接到 robomongo [重复]

RoboMongo:不显示所有文档

robomongo 怎么导出数据

[MongoDB]可视化工具Robomongo