如何将MongoDB查询结果导出到CSV文件

发布于

MongoDB 数据库工具包含一个名为 mongoexport 的命令行实用工具,支持将 MongoDB 数据导出为 CSV 或 JSON 文件。

您可以使用此用途执行的操作之一是导出查询结果。本文介绍如何将 MongoDB 查询结果导出到 CSV 文件。mongoexport

语法

的语法是这样的:mongoexport

mongoexport --collection=<coll> <options> <connection-string>

您需要从系统的命令行(例如,新的终端或命令提示符窗口)运行命令。mongoexport

不要从命令行管理程序运行命令。mongoexport``mongo

例

以下示例代码将查询结果导出到 CSV 文件:

mongoexport --db=PetHotel --collection=pets --type=csv --fields=_id,name,type,weight --query='{ "type": "Dog" }' --out=data/dogs.csv

这将导出查询数据库中调用的集合的查询。查询将导出到文件夹中调用的文件。pets``PetHotel``dogs.csv``data/

如果该文件夹不存在,则会创建该文件夹。与文件相同。顺便说一下,这假设将文件写入指定位置没有权限问题。

在此示例中,我没有指定任何主机、端口、身份验证等,因此它从默认本地主机端口号上运行的 MongoDB 实例导出集合。27017

以下是我们在此处提供的参数的说明。

参数 描述
--db
或
-d 指定要在其上运行 的数据库。在这种情况下,数据库称为 。
也可以使用 (而不是 ) 传递此参数。mongoexport``PetHotel``-d``--db
--collection
或
-c 指定要导出(或对其运行查询)的集合。在这种情况下,集合称为 。
也可以将此参数作为 (而不是 ) 传递。pets``-c``--collection
--type 指定导出的文件类型。在这种情况下,我们指定将其导出为CSV文件。csv
--fields 指定要导出的字段。我们可以选择导出所有字段或仅导出部分字段。您需要在此处列出每个,用逗号分隔。导出为 CSV 时,必须指定字段名称。您可以通过参数或参数(稍后会详细介绍)执行此操作。--fields``--fieldFile
--query
或
-q 指定要导出其结果的查询。这必须括在单引号中(这样它就不会与你的 shell 交互)。
也可以使用 传递此参数。-q
--out 指定导出的文件名及其位置。如果未指定文件名, 会将数据写入标准输出 ()。mongoexport``stdout

检查导出的文件

让我们验证导出操作是否按预期工作。

首先,让我们针对原始集合运行查询。

use PetHotel
db.pets.find({ "type": "Dog" })

结果:

{ “_id” : 1, “name” : “Wag”, “type” : “Dog”, “weight” : 20 } { “_id” : 2, “name” : “Bark”, “type” : “Dog”, “weight” : 10 } { “_id” : 6, “name” : “Fetch”, “type” : “Dog”, “weight” : 17 } { “_id” : 7, “name” : “Jake”, “type” : “Dog”, “weight” : 30 }

因此,我们可以看到有 4 只狗,它们都具有我们在导出操作中指定的相同字段。

现在让我们打开导出的文件以查看其中的内容:dogs.csv

_id,name,type,weight 1,Wag,Dog,20 2,Bark,Dog,10 6,Fetch,Dog,17 7,Jake,Dog,30

好的,所以所有数据都按预期在导出的文件中。

导出较少字段

如果需要,您可以使用参数指定较少的字段。--fields

例:

mongoexport --db=PetHotel --collection=pets --type=csv --fields=name,weight --query='{ "type": "Dog" }' --out=data/dogs.csv

生成的文件:

name,weight Wag,20 Bark,10 Fetch,17 Jake,30

删除列标题

您会注意到,前面示例中导出的文件包含列标题。

您还可以选择导出_不带_列标题的文件。为此,请使用该参数。--noHeaderLine

例:

mongoexport --db=PetHotel --collection=pets --type=csv --fields=_id,name,type,weight --query='{ "type": "Dog" }' --noHeaderLine --out=data/dogs.csv

现在,当我打开导出的文件时,没有列标题:

1,Wag,Dog,20 2,Bark,Dog,10 6,Fetch,Dog,17 7,Jake,Dog,30

使用文件作为字段名称

您可以将参数替换为参数,以指定包含要导出的字段名称的文件的名称。--field``--fieldFile

mongoexport --db=PetHotel --collection=pets --type=csv --fieldFile=data/dogs_fields.txt --query='{ "type": "Dog" }' --out=data/dogs.csv

包含字段的文件必须列出字段,每行一个。

下面是此示例中的文件外观:dogs_fields.txt

name type weight

这导致导出文件的内容如下所示:

name,type,weight Wag,Dog,20 Bark,Dog,10 Fetch,Dog,17 Jake,Dog,30

更改列顺序

您可以切换要导出的字段的顺序。它们不必与基础文档的顺序相同。

例如,此代码:

mongoexport --db=PetHotel --collection=pets --type=csv --fields=type,name,weight,_id --query='{ "type": "Dog" }' --out=data/dogs.csv

结果为以下 CSV 文件:

type,name,weight,_id Dog,Wag,20,1 Dog,Bark,10,2 Dog,Fetch,17,6 Dog,Jake,30,7

访问控制/身份验证

如果不使用 localhost,则可以使用该参数来指定主机和端口。还可以使用该参数指定用户名和密码。如果省略密码参数,系统将提示您输入密码参数。还有一个参数用于指定已在其中创建用户的身份验证数据库。--host``--port``--username``--password``--authenticationDatabase

例:

mongoexport --host=myhost.example.com --port=37017 --username=homer --authenticationDatabase=admin --db=PetHotel --collection=pets --type=csv --fields=_id,name,type,weight --query='{ "type": "Dog" }' --out=data/dogs.csv

检查mongoexport

mongoexport是 MongoDB 数据库工具包的一部分。MongoDB数据库工具是一套用于使用MongoDB的命令行实用程序。

如果您不确定是否安装了MongoDB数据库工具/,请尝试在终端或命令提示符下运行以下命令进行检查:mongoexport

mongoexport --version

如果有,您应该会看到版本信息等。如果您没有它,您可以使用MongoDB网站上的安装说明将其安装到您的系统上。

在哪里运行命令?

不要忘记,您需要从系统的命令行(例如新的终端或命令提示符窗口)运行命令。mongoexport