如何在Ubuntu14.04上导入和导出MongoDB数据库

来自菜鸟教程
跳转至:导航、​搜索

MongoDB 是最流行的 NoSQL 数据库引擎之一。 它以可扩展、强大、可靠和易于使用而闻名。 在本文中,我们将向您展示如何导入和导出 MongoDB 数据库。

我们应该明确一点,本文中的导入和导出是指以人类可读的格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用 MongoDB 特定的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的 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,则会出现所谓的信息“保真度损失”。 这就是为什么备份/恢复最好使用能够更好地恢复 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 中使用二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在晚上进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。