【问题标题】:How to export collection to CSV in MongoDB?如何在 MongoDB 中将集合导出到 CSV?
【发布时间】:2011-10-12 10:49:38
【问题描述】:

如何将 MongoDB 集合中的所有记录导出到 .csv 文件?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

这要求我指定需要导出的字段的名称。我可以不指定字段名称就直接导出所有字段吗?

【问题讨论】:

    标签: mongodb csv schemaless database


    【解决方案1】:

    @karoly-horvath 说得对。 csv 必填字段。

    根据 MongoDB 问题跟踪器 https://jira.mongodb.org/browse/SERVER-4224 中的这个错误,您必须在导出到 csv 时提供字段。文档并不清楚。这就是错误的原因。

    试试这个:

    mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName
    

    更新:

    此提交:https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 修复了 3.0.0-rc10 及更高版本的文档。它改变了

    Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`
    

    Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`
    

    3.0 及以上版本:

    您应该使用--type=csv 而不是--csv,因为它已被弃用。

    更多详情:https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

    完整命令:

    mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
    

    【讨论】:

    • 从 3.0.6 版开始,mongoexport 表示 csv flag is deprecated; please use --type=csv instead
    • 感谢(感谢匿名)3.0 及更高版本的编辑。
    • 有没有一种快速的方法来包含所有字段而不是命名每个字段?
    【解决方案2】:

    此外,逗号分隔的字段名称之间不允许有空格。

    不好: -f firstname, lastname

    好: -f firstname,lastname

    【讨论】:

      【解决方案3】:
      mongoexport  --help
      ....
      -f [ --fields ] arg     comma separated list of field names e.g. -f name,age
      --fieldFile arg         file with fields names - 1 per line
      

      您必须手动指定它,如果您考虑一下,它会非常有意义。 MongoDB 是无模式的;另一方面,CSV 具有固定的列布局。如果不知道不同文档中使用了哪些字段,就不可能输出 CSV 转储。

      如果您有一个固定的架构,也许您可​​以检索一个文档,使用脚本从中获取字段名称并将其传递给 mongoexport。

      【讨论】:

      • 我只是在搜索是否可以从记录中获取字段列表。即来自 db.collection.finOne().getFields()。但我想这不是正确的方法(getFields)。我也试过 getKeys() 。否则我将不得不使用 key:value 哈希来获取记录。
      • 我正在尝试做同样的事情,但要弄清楚为什么它不能正确导入 csv 文件。就我而言,我需要它告诉我关于它自己的一切,包括它自己“发明”的领域。所以在我的情况下,必须指定字段并不完全有意义,因为我不知道它们都是什么!
      • 在收割脚本前面,我在一年多前发过this,可能会给你一些想法。
      【解决方案4】:

      如果需要,您可以将所有集合导出到 csv 而不指定 --fields(将导出所有字段)。

      http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ 运行这个 bash 脚本

      OIFS=$IFS;
      IFS=",";
      
      # fill in your details here
      dbname=DBNAME
      user=USERNAME
      pass=PASSWORD
      host=HOSTNAME:PORT
      
      # first get all collections in the database
      collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
      collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
      collectionArray=($collections);
      
      # for each collection
      for ((i=0; i<${#collectionArray[@]}; ++i));
      do
          echo 'exporting collection' ${collectionArray[$i]}
          # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
          keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
          # now use mongoexport with the set of keys to export the collection to csv
          mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
      done
      
      IFS=$OIFS;
      

      【讨论】:

      • 上述脚本的唯一问题是它假定每个集合中的第一个文档包含所有可能出现在该集合中的文档中的键;如果文档类型可以包含数组或嵌套子文档,则情况可能并非如此。
      • @arober11 你说得对,忘了提这个重要的事实。我通常做的是运行map reduce script 定期收集所有密钥并使用它来拉所有密钥
      【解决方案5】:

      适用于我使用 mongo:4.2.6 远程处理到 docker 容器

      mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv
      

      【讨论】:

        【解决方案6】:

        我无法让 mongoexport 为我执行此操作。我发现,要获得所有字段的详尽列表,您需要遍历整个集合一次。使用它来生成标题。然后再次遍历集合以填充每个文档的这些标题。

        我已经编写了一个脚本来执行此操作。将 MongoDB 文档转换为 csv,而不考虑各个文档之间的架构差异。

        https://github.com/surya-shodan/mongoexportcsv

        【讨论】:

          【解决方案7】:

          此外,如果您想导出内部 json 字段,请使用点(. 运算符)。

          JSON 记录:

          {
              "_id" : "00118685076F2C77",
              "value" : {
                  "userIds" : [ 
                      "u1"
                  ],
                  "deviceId" : "dev"
          }
          

          带有点运算符的 mongoexport 命令(使用 mongo 版本 3.4.7):

          ./mongoexport --host localhost --db myDB --collection myColl --type=csv --out out.csv --fields value.deviceId,value.userIds

          输出 csv:

          value.deviceId,value.userIds
          d1,"[""u1""]"
          d2,"[""u2""]"
          

          注意:确保不要导出数组。它会破坏 CSV 格式,如上面显示的字段 userIds

          【讨论】:

            【解决方案8】:

            使用 Mongo Compass 工具轻松导出 csv 或 json 文件

            Mongo Compass 作为 MongoDB 的 GUI,MongoDB Compass 允许您在文档结构、查询、索引、文档验证等方面做出更明智的决策。商业订阅包括对 MongoDB Compass 的技术支持。 https://www.mongodb.com/try/download/compass

            【讨论】:

              【解决方案9】:

              MongoDB Atlas 用户解决方案!

              --fields 参数添加为用双引号括起来的逗号分隔字段名称:

              --fields "<FIELD 1>,<FIELD 2>..."
              

              这是完整的例子:

              mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."
              

              【讨论】:

                【解决方案10】:

                这对我有用,试试吧

                mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword
                

                cmd 以上返回用户集合的全部数据 如果你想要过滤字段然后添加 --fields=email,name

                【讨论】:

                • 这与下面的答案有何不同?
                • mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out /var/www/html/documents/db-12-2020 --authenticationDatabase admin - -ssl --username youruname --password yourpassword 你可以试试这个也给你整个集合。
                【解决方案11】:

                对于所有遇到错误的人。

                让我给你们一个解决方案,并简要解释一下:-

                连接命令:-

                mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin
                

                --host --> Mongo服务器的主机

                --port --> Mongo服务器端口

                -u --> 用户名

                -p --> 密码

                --db --> 要从中导出的数据库

                --collection --> 要导出的集合

                --type --> 导出类型在我的例子中是 CSV

                --out --> 要导出的文件名

                --fields --> 您要导出的所有字段(如果是 CSV,请不要在逗号之间的两个字段名称之间留空格)

                --authenticationDatabase --> 存储所有用户信息的数据库

                【讨论】:

                  【解决方案12】:

                  以下命令用于将集合导出为 CSV 格式。

                  注意:naag 是数据库,employee1_json 是一个集合。

                  mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
                  

                  【讨论】:

                  • 这是 mongodb 4 返回的内容:失败:CSV 模式需要字段列表
                  猜你喜欢
                  • 1970-01-01
                  • 2020-10-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-03
                  • 2020-05-08
                  相关资源
                  最近更新 更多