如何在MongoDB中将集合导出为CSV文件?

121

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

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

这个问题要求我指定需要导出的字段的名称。我能否不指定字段名称而导出所有字段?

12个回答

143

@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

19
自版本3.0.6起,mongoexport命令提示csv标志已被弃用,请使用--type=csv代替。 - Roman Dibikhin
感谢匿名贡献的3.0及以上版本编辑。 - campeterson
5
有没有一种快速的方法可以包括所有字段而不是逐个命名? - Kevz

54

此外,您不能在逗号分隔的字段名称之间添加空格。

错误示例: -f firstname, lastname

正确示例: -f firstname,lastname


27
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。

1
我只是在搜索是否可以从记录中获取字段列表。即从db.collection.finOne().getFields()。但我猜那不是正确的方法(getFields)。我也尝试了getKeys()。否则我将不得不使用键值哈希来获取记录。 - Succeed Stha
我正在尝试做同样的事情,但是要弄清楚为什么它不能正确地导入CSV文件。在我的情况下,我需要它告诉我关于自己的一切,包括它自己“发明”的字段。因此,在我的情况下,不必指定字段并不完全合理,因为我不知道它们都是什么! - Stephen
在采收脚本方面,我大约一年前发布了这篇文章,或许可以给你一些启示。 - arober11

10

如果您想要将所有集合导出为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;

4
以上脚本的唯一问题在于,它假定每个集合中的第一个文档包含可能出现在该集合中的文档中的所有键;如果文档类型可以包含数组或嵌套子文档,则可能并非如此。 - arober11
@arober11 你说得对,忘了提到这个重要的事实。我通常会运行一个map reduce脚本定期收集所有键,并使用它来拉取所有键。 - Michael

6

Mongo Compass工具轻松导出CSV或JSON文件

MongoDB Compass作为MongoDB的图形用户界面,使您能够更智能地决策有关文档结构、查询、索引、文档验证等方面的问题。商业订阅还包括对MongoDB Compass的技术支持。 https://www.mongodb.com/try/download/compass enter image description here


4

我使用远程访问连接到一个运行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

3
我无法让mongoexport为我完成此操作。 我发现,要获取所有字段的详尽列表,您需要遍历整个集合一次。 使用此方法生成标题。 然后再次遍历集合以为每个文档填充这些标题。
我编写了一个脚本来完成这个任务。 无论个别文档之间的模式差异如何,都可以将MongoDB文档转换为csv。 https://github.com/surya-shodan/mongoexportcsv

2

如果您想导出内部 JSON 字段,请使用点号(.)操作符。

JSON 记录:

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

使用mongo版本3.4.7的点运算符的mongoexport命令:

./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字段一样。


0

这个对我起作用,试试吧

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

以上命令返回用户集合的所有数据,如果您想要筛选字段,则添加 --fields=email,name


这与下面的答案有何不同? - Daniel W.
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你也可以尝试这个,它会给你整个集合。 - manoj patel

0

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>..."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接