MongoDB 是最流行的 NoSQL 数据库引擎之一。 它以可扩展、强大、可靠和易于使用而闻名。 在本文中,我们将向您展示如何导入和导出 MongoDB 数据库。
我们应该明确一点,本文中的导入和导出是指以人类可读的格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用 MongoDB 特定的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的 MongoDB 属性。 因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。 备份、恢复和迁移超出了本文的范围——请参阅 如何在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库。
先决条件
在学习本教程之前,请确保您完成以下先决条件:
- Ubuntu 14.04 液滴
- 非 root sudo 用户。 查看 Initial Server Setup with Ubuntu 14.04 了解详情。
- 使用文章 如何在 Ubuntu 14.04 上安装 MongoDB 安装和配置 MongoDB。
除非另有说明,本教程中所有需要 root 权限的命令都应以具有 sudo 权限的非 root 用户身份运行。
了解基础知识
在继续阅读本文之前,需要对此事有一些基本的了解。 如果您有使用流行的关系数据库系统(例如 MySQL)的经验,您可能会在使用 MongoDB 时发现一些相似之处。
您应该知道的第一件事是 MongoDB 使用 json 和 bson(二进制 json)格式来存储其信息。 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
结果应如下所示:
mongoimport 的输出
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()
结果应如下所示:
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
数据库中导出餐馆集合。 可以这样做:
sudo mongoexport --db newdb -c restaurants --out newdbexport.json
在上面的命令中,我们使用 --db
指定数据库,-c
指定集合,--out
指定保存数据的文件。
成功的 mongoexport
的输出应如下所示:
mongoexport 的输出
2016-01-20T03:39:00.143-0500 connected to: localhost 2016-01-20T03:39:03.145-0500 exported 25359 records
上面的输出显示已经导入了 25359 个文档——与导入的文档数量相同。
在某些情况下,您可能只需要导出收藏的一部分。 考虑到餐厅 json 文件的结构和内容,让我们导出所有满足位于布朗克斯区并提供中餐条件的餐厅。 如果我们想在连接到 MongoDB 时直接获取此信息,请再次连接到数据库:
sudo mongo newdb
然后,使用此查询:
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
结果显示在终端上。 要退出 MongoDB 提示符,请在提示符处键入 exit
:
exit
如果要从 sudo 命令行导出数据,而不是在连接到数据库时导出数据,请通过为 -q
参数指定之前的查询,将其作为 mongoexport
命令的一部分,如下所示:
sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
请注意,我们在双引号内使用单引号作为查询条件。 如果您使用双引号或 $
等特殊字符,则必须在查询中使用反斜杠 (\
) 对它们进行转义。
如果导出成功,结果应如下所示:
mongoexport 的输出
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 中使用二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在晚上进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。