MongoDB 是最流行的 NoSQL 数据库引擎之一。它以可扩展、功能强大、可靠且易于使用而闻名。在本文中,我们将向您展示如何导入和导出 MongoDB 数据库。
我们应该明确指出,本文中的导入和导出是指以人类可读的格式处理数据,并与其他软件产品兼容。相比之下,备份和恢复操作创建或使用 MongoDB 特定的二进制数据,这不仅保留数据的一致性和完整性,还保留其特定的 MongoDB 属性。因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。备份、恢复和迁移超出了本文的范围 - 请参阅如何在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库.
在学习本教程之前,请确保您满足以下先决条件:
- Ubuntu 14.04 小滴
- 非 root sudo 用户。查看使用 Ubuntu 14.04 进行初始服务器设置了解详情。
- 使用本文安装和配置 MongoDB如何在 Ubuntu 14.04 上安装 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,将会出现所谓的信息“保真度损失”。这就是为什么备份/恢复最好使用二进制 bson,它能够更好地恢复 MongoDB 数据库。
其次,您不必担心显式创建 MongoDB 数据库。如果您指定导入的数据库尚不存在,则会自动创建。集合(数据库表)结构的情况更好。与其他数据库引擎相比,在 MongoDB 中,结构会在第一个文档(数据库行)插入时再次自动创建。
第三,在 MongoDB 中读取或插入大量数据(例如本文的任务)可能会占用大量资源,并消耗大量 CPU、内存和磁盘空间。考虑到 MongoDB 经常用于大型数据库和大数据,这一点至关重要。此问题最简单的解决方案是在夜间运行导出/备份。
第四,如果您有一个繁忙的 MongoDB 服务器,并且信息在数据库导出过程中发生变化,那么信息一致性可能会出现问题。此问题没有简单的解决方案,但在本文末尾,您将看到进一步阅读有关复制的建议。
要了解如何将信息导入 MongoDB,让我们使用有关餐馆的流行示例 MongoDB 数据库。它是 .json 格式,可以使用以下命令下载wget
像这样:
-
wgethttps://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
下载完成后,您应该有一个名为primer-dataset.json
(12 MB 大小)在当前目录中。让我们将该文件中的数据导入到名为的新数据库中newdb
并放入一个名为的集合中restaurants
。对于导入,我们将使用命令mongoimport
像这样:
-
sudo蒙戈进口公司--db newdb - 收藏餐馆--file底漆数据集.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自动创建它。
让我们通过连接到新创建的 MongoDB 数据库来验证导入newdb
像这样:
您现在已连接到新创建的newdb
数据库实例。请注意,您的提示已更改,表明您已连接到数据库。
使用以下命令计算餐厅集合中的文档数量:
结果应该显示为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
在提示符下:
您将作为非 root 用户返回到正常的命令行提示符。
正如我们之前提到的,通过导出 MongoDB 信息,您可以获得包含数据的人类可读文本文件。默认情况下,信息以 json 格式导出,但您也可以导出为 csv(逗号分隔值)。
要从 MongoDB 导出信息,请使用命令mongoexport
。它允许您导出非常细粒度的导出,以便您可以指定数据库、集合、字段,甚至可以使用查询进行导出。
一个简单的mongoexport
示例是从以下位置导出餐馆集合newdb
我们之前导入的数据库。可以这样做:
-
sudo蒙戈出口公司--db newdb -c餐馆--out新数据库导出.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 个文档 — 与导入的文档数量相同。
在某些情况下,您可能只需要导出集合的一部分。考虑到restaurants json文件的结构和内容,让我们导出所有满足位于布朗克斯区并提供中国菜的标准的餐厅。如果我们想在连接到 MongoDB 时直接获取这些信息,请再次连接到数据库:
然后,使用以下查询:
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
结果显示到终端。要退出 MongoDB 提示符,请键入exit
在提示符下:
如果您想从 sudo 命令行导出数据,而不是在连接到数据库时导出数据,请将上一个查询作为mongoexport
通过指定它的命令-q
像这样的论点:
-
sudo蒙戈出口公司--db newdb -c餐馆-q "{ 行政区:'布朗克斯',美食:'中式' }" --outBronx_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 数据库 and 如何设置可扩展的 MongoDB 数据库.
复制不仅对于可扩展性有用,而且对于当前的主题也很重要。复制允许您在从故障中恢复主服务器时,从从 MongoDB 服务器上不间断地继续运行 MongoDB 服务。复制的一部分也是操作日志(oplog),它记录了修改您数据的所有操作。您可以使用此日志,就像在 MySQL 中使用二进制日志一样,在上次备份发生后恢复数据。请记住,备份通常在夜间进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。