如何在MongoDB中将集合导出到CSV?


97

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

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

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

Answers:


112

@ 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

16
随着3.0.6版本mongoexportcsv flag is deprecated; please use --type=csv instead
罗马Dibikhin

感谢(匿名)进行3.0及更高版本的编辑。
campeterson

4
有没有一种快速的方法来包含所有字段而不是为每个字段命名?
凯夫兹

53

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

坏: -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()。否则,我将不得不获取带有key:value哈希值的记录。
成功Stha 2011年

我正在尝试做同样的事情,但要弄清楚为什么它不能正确导入csv文件。就我而言,我需要它来告诉我有关自身的一切,包括它自己“发明”了哪些领域。因此,就我而言,必须指定字段并不是完全合理,因为我不知道它们都是什么!
斯蒂芬

在田间收割脚本的前面,我大约一年前发布了这篇文章,可能会给您一些想法。
arober11

9

如果需要,可以将所有集合导出到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 2014年

@ arober11你是对的,忘了提及这一重要事实。我通常要做的是运行一个map reduce脚本来定期收集所有密钥,并使用它来拉取所有密钥
Michael

3

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

我已经写了一个脚本来做到这一点。无论单个文档之间的架构差异如何,将MongoDB文档转换为csv。

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


2

另外,如果要导出内部json字段,请使用点(。运算符)。

JSON记录:

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

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

./mongoexport --host本地主机--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

适用于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>..."

-1

这为我工作尝试

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


这与下面的答案有何不同?
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-您可以尝试输入密码yourpassword,这也为您提供了完整的收藏夹。
manoj patel

-1

对我有用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

-2

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

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

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

这是mongodb 4返回的内容:失败:CSV模式需要字段列表
FRIDDAY

-2

对于那些坚持错误的人。

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

连接命令:-

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->存储所有用户信息的数据库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.