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

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

作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

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

我们应该明确指出,导入和导出是指那些以人类可读格式处理数据的操作,与其他软件产品兼容。 相比之下,备份和恢复操作会创建或使用 MongoDB 特定的二进制数据,从而保持数据的一致性和完整性以及特定的 MongoDB 属性。 因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。

备份、还原和迁移任务超出了本文的范围。 有关详细信息,请参阅 如何在 Ubuntu 20.04 上备份、恢复和迁移 MongoDB 数据库。

先决条件

要完成本教程,您将需要以下内容:

第 1 步 — 将信息导入 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

结果将如下所示:

Output2020-11-11T19:37:55.607+0000    connected to: mongodb://localhost/
2020-11-11T19:37:57.841+0000    25359 document(s) imported successfully. 0 document(s) failed to import

如上述命令所示,已导入 25359 个文档。 因为我们没有名为 newdb 的数据库,MongoDB 自动创建了它。

让我们验证导入。

连接到新创建的 newdb 数据库:

sudo mongo newdb

您现在已连接到 newdb 数据库实例。 请注意,您的提示已更改,表明您已连接到数据库。

使用以下命令计算餐厅集合中的文档:

db.restaurants.count()

结果会显示25359,即导入文档的数量。 为了更好地检查,您可以从餐厅集合中选择第一个文档,如下所示:

db.restaurants.findOne() 

结果将如下所示:

Output{
    "_id" : ObjectId("5fac3d937f12c471b3f26733"),
    "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 用户返回到正常的命令行提示符。

第 2 步 — 从 MongoDB 导出信息

正如我们之前提到的,通过导出 MongoDB 信息,您可以获得包含数据的人类可读文本文件。 默认情况下,信息以 json 格式导出,但您也可以导出为 csv(逗号分隔值)。

要从 MongoDB 导出信息,请使用命令 mongoexport。 它允许您导出非常细粒度的导出,以便您可以指定数据库、集合、字段,甚至使用查询进行导出。

一个简单的 mongoexport 示例是从我们之前导入的 newdb 数据库中导出餐馆集合。 可以这样做:

sudo mongoexport --db newdb -c restaurants --out newdbexport.json

在上面的命令中,我们使用 --db 指定数据库,-c 指定集合,--out 指定保存数据的文件。

成功的 mongoexport 的输出应如下所示:

Output2020-11-11T19:39:57.595+0000    connected to: mongodb://localhost/
2020-11-11T19:39:58.619+0000    [###############.........]  newdb.restaurants  16000/25359  (63.1%)
2020-11-11T19:39:58.871+0000    [########################]  newdb.restaurants  25359/25359  (100.0%)
2020-11-11T19:39:58.871+0000    exported 25359 records

上面的输出显示已经导入了 25359 个文档——与导入的文档数量相同。

在某些情况下,您可能只需要导出收藏的一部分。 考虑到餐厅 json 文件的结构和内容,让我们导出所有满足位于布朗克斯区并提供中餐条件的餐厅。 如果我们想在连接到 MongoDB 时直接获取此信息,请再次连接到数据库:

sudo mongo newdb

然后,使用此查询:

db.restaurants.find( { "borough": "Bronx", "cuisine": "Chinese" } )

结果显示到终端:

Output2020-12-03T01:35:25.366+0000 connected to: mongodb://localhost/
2020-12-03T01:35:25.410+0000 exported 323 records

要退出 MongoDB 提示符,请键入 exit

exit

如果要从 sudo 命令行导出数据,而不是在连接到数据库时导出数据,请通过为 -q 参数指定之前的查询,将其作为 mongoexport 命令的一部分,如下所示:

sudo mongoexport --db newdb -c restaurants -q "{\"borough\": \"Bronx\", \"cuisine\": \"Chinese\"}" --out Bronx_Chinese_retaurants.json

请注意,我们在查询中使用反斜杠 (\) 转义双引号。 同样,您必须转义查询中的任何其他特殊字符。

如果导出成功,结果应如下所示:

Output2020-11-11T19:49:21.727+0000    connected to: mongodb://localhost/
2020-11-11T19:49:21.765+0000    exported 323 records

如上所示,已经导出了 323 条记录,您可以在我们指定的 Bronx_Chinese_retaurants.json 文件中找到它们。

使用 catless 扫描数据:

cat Bronx_Chinese_retaurants.json | less

使用 SPACE 对数据进行分页:

Outputdate":{"$date":"2015-01-14T00:00:00Z"},"grade":"Z","score":36}],"na{"_id":{"$oid":"5fc8402d141f5e54f9054f8d"},"address":{"building":"1236","coord":[-73.8893654,40.81376179999999],"street":"238 Spofford Ave","zipcode":"10474"},"borough":"Bronx","cuisine":"Chinese","grades":[{"date":{"$date":"2013-12-30T00:00:00Z"},"grade":"A","score":8},{"date":{"$date":"2013-01-08T00:00:00Z"},"grade":"A","score":10},{"date":{"$date":"2012-06-12T00:00:00Z"},"grade":"B","score":15}],

. . .

q 退出。 您现在可以导入和导出 MongoDB 数据库。

结论

本文向您介绍了在 MongoDB 数据库中导入和导出信息的基本知识。 您可以继续阅读 如何在 Ubuntu 20.04 上备份、恢复和迁移 MongoDB 数据库。

您还可以考虑使用复制。 当您从故障中恢复主服务器时,复制允许您继续从从属 MongoDB 服务器不间断地运行您的 MongoDB 服务。 复制的一部分是操作日志(oplog),它记录了所有修改你数据的操作。 您可以使用此日志,就像在 MySQL 中使用二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在晚上进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。