【问题标题】:How to export JSON from MongoDB using Robomongo如何使用 Robomongo 从 MongoDB 导出 JSON
【发布时间】: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”会很简单。这不是。

标签: mongodb robo3t


【解决方案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)中执行此操作的最简单方法:

              1. 在 Robo 3T GUI 的右上角有一个“以文本形式查看结果 模式”按钮,单击它并复制所有内容

              2. 将所有内容粘贴到此网站:https://json-csv.com/

              3. 单击下载按钮,现在您将其保存在电子表格中。

              希望这对某人有所帮助,因为我希望 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】:
                1. 进行搜索
                2. JSON 模式下的按钮视图结果
                3. 将结果复制到单词
                4. 从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 等类型时,可能会在导入过程中导致错误...

                  黑客愉快:)

                  【讨论】:

                    猜你喜欢
                    • 2015-08-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-04-04
                    • 2016-04-27
                    • 2020-07-22
                    • 2016-09-24
                    • 2017-04-25
                    相关资源
                    最近更新 更多