MongoDB 是最流行的 NoSQL 数据库引擎之一。它以可扩展、强大、可靠和易于使用而闻名。在本文中,我们将向您展示如何导入和导出您的 MongoDB 数据库。
我们应该明确指出,在本文中,通过导入和导出,我们指的是处理以人类可读格式存储的数据,这种格式与其他软件产品兼容。相比之下,备份和恢复操作创建或使用特定于 MongoDB 的二进制数据,这不仅可以保持数据的一致性和完整性,还可以保留其特定的 MongoDB 属性。因此,对于迁移,通常最好使用备份和恢复,只要源和目标系统是兼容的。备份、恢复和迁移超出了本文的范围 - 请参阅《如何在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库》。
先决条件
在按照本教程之前,请确保您完成以下先决条件:
- Ubuntu 14.04 Droplet
- 非 root sudo 用户。详细信息请参阅《使用 Ubuntu 14.04 进行初始服务器设置》。
- 已安装并配置 MongoDB,使用文章《如何在 Ubuntu 14.04 上安装 MongoDB》。
除非另有说明,在本教程中需要 root 权限的所有命令都应该以具有 sudo 权限的非 root 用户身份运行。
理解基础知识
在继续阅读本文之前,需要对相关内容有一些基本的了解。如果您有使用流行的关系型数据库系统(如 MySQL)的经验,那么在使用 MongoDB 时可能会发现一些相似之处。
您应该知道的第一件事是,MongoDB 使用 json 和 bson(二进制 json)格式来存储信息。Json 是一种人类可读的格式,非常适合导出和最终导入您的数据。您可以使用任何支持 json 的工具来进一步管理导出的数据,包括简单的文本编辑器。
一个示例的 json 文档如下:
{"address":[ {"building":"1007", "street":"Park Ave"}, {"building":"1008", "street":"New Ave"}, ]}
Json 很方便使用,但它不支持 bson 中的所有数据类型。这意味着如果您使用 json,信息将会出现所谓的“信息丢失”。这就是为什么在备份/恢复时最好使用能够更好地恢复您的 MongoDB 数据库的二进制 bson。
其次,您不必担心显式创建 MongoDB 数据库。如果您指定要导入的数据库不存在,它将会自动创建。与其他数据库引擎相比,MongoDB 中的集合(数据库表)结构也是自动在第一次插入文档(数据库行)时创建的。
第三,在 MongoDB 中,读取或插入大量数据(例如本文任务中的任务)可能会消耗大量 CPU、内存和磁盘空间,这可能会对资源造成压力。考虑到 MongoDB 经常用于大型数据库和大数据,这是一个很关键的问题。这个问题的最简单解决方案是在夜间运行导出/备份。
第四,如果您的 MongoDB 服务器繁忙,在数据库导出过程中信息发生变化,信息一致性可能会成为一个问题。这个问题没有简单的解决方案,但在本文结束时,您将看到有关复制的进一步阅读建议。
将信息导入 MongoDB
为了了解将信息导入 MongoDB 的工作原理,让我们使用一个关于餐馆的流行示例 MongoDB 数据库。它以 .json 格式提供,并且可以使用 wget
进行下载,如下所示:
wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
下载完成后,您应该在当前目录中有一个名为 primer-dataset.json
(大小为 12 MB)的文件。让我们将此文件中的数据导入到一个名为 newdb
的新数据库中,并导入到一个名为 restaurants
的集合中。我们将使用 mongoimport
命令进行导入,如下所示:
sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
结果应该如下所示:
2016-01-17T14:27:04.806-0500 connected to: localhost 2016-01-17T14:27:07.315-0500 imported 25359 documents
如上所示,已导入 25359 个文档。因为我们没有名为 newdb
的数据库,MongoDB 自动创建了它。
让我们通过连接到新创建的名为 newdb
的 MongoDB 数据库来验证导入,如下所示:
sudo mongo newdb
您现在已连接到新创建的 newdb
数据库实例。请注意,您的提示符已更改,表示您已连接到数据库。
使用以下命令计算餐馆集合中的文档数:
db.restaurants.count()
结果应该显示为 25359
,正好是导入文档的数量。为了进行更好的检查,您可以选择餐馆集合中的第一个文档,如下所示:
db.restaurants.findOne()
结果应该如下所示:
{ "_id" : ObjectId("569beb098106480d3ed99926"), "address" : { "building" : "1007", "coord" : [ -73.856077, 40.848447 ], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [ { "date" : ISODate("2014-03-03T00:00:00Z"), "grade" : "A", "score" : 2 }, ... ], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }
这样详细的检查可以揭示文档中的问题,例如它们的内容、编码等。json 格式使用 UTF-8
编码,您的导出和导入应该使用该编码。如果您手动编辑 json 文件,请记住这一点。否则,MongoDB 将自动为您处理。
要退出 MongoDB 提示符,请在提示符处键入 exit
:
exit
您将返回到普通的命令行提示符,作为您的非 root 用户。
从 MongoDB 导出信息
正如我们之前提到的,通过导出 MongoDB 信息,您可以获得一个包含数据的可读文本文件。默认情况下,信息以 json 格式导出,但您也可以导出为 csv(逗号分隔值)。
要从 MongoDB 导出信息,请使用 mongoexport
命令。它允许您进行非常精细的导出,以便您可以指定数据库、集合、字段,甚至可以使用查询进行导出。
一个简单的 mongoexport
示例是从我们之前导入的 newdb
数据库中导出 restaurants 集合。可以这样做:
sudo mongoexport --db newdb -c restaurants --out newdbexport.json
在上面的命令中,我们使用 --db
指定数据库,-c
指定集合,--out
指定数据将保存在哪个文件中。
成功的 mongoexport
输出应该如下所示:
2016-01-20T03:39:00.143-0500 connected to: localhost 2016-01-20T03:39:03.145-0500 exported 25359 records
上面的输出显示已导出 25359 条记录 — 与导入的数量相同。
在某些情况下,您可能需要仅导出集合的一部分。考虑到 restaurants json 文件的结构和内容,让我们导出满足以下条件的所有餐馆:位于布朗克斯区并提供中餐。如果我们想要直接在连接到 MongoDB 时获取此信息,请重新连接到数据库:
sudo mongo newdb
然后,使用此查询:
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
结果将显示在终端上。要退出 MongoDB 提示符,请在提示符处键入 exit
:
exit
如果您想要从 sudo 命令行而不是在连接到数据库时导出数据,请将上一个查询作为 mongoexport
命令的一部分,通过为 -q
参数指定它,如下所示:
sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
请注意,我们在查询条件中使用单引号内嵌在双引号中。如果您使用双引号或特殊字符如 $
,您将需要在查询中用反斜杠(\
)进行转义。
如果导出成功,结果应该如下所示:
2016-01-20T04:16:28.381-0500 connected to: localhost 2016-01-20T04:16:28.461-0500 exported 323 records
上面显示了已导出 323 条记录,并且您可以在我们指定的 Bronx_Chinese_retaurants.json
文件中找到它们。
结论
本文介绍了将信息导入和导出到 MongoDB 数据库的基本知识。您可以继续阅读《在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库》和《如何设置可扩展的 MongoDB 数据库》。
复制不仅对可扩展性有用,而且对当前主题也很重要。复制允许您在从故障中恢复主服务器时,从从属 MongoDB 服务器中无间断地继续运行 MongoDB 服务。复制的一部分还是操作日志(oplog),它记录修改数据的所有操作。您可以像在 MySQL 中使用二进制日志一样使用此日志,在最后一次备份后恢复数据。请记住,备份通常在夜间进行,如果您决定在晚上恢复备份,您将错过自上次备份以来的所有更新。