阅读 26

在Ubuntu 20.04上导入和导出一个MongoDB数据库

作者选择了COVID-19救济基金,通过Write for DOnations计划接受捐款。

简介

MongoDB是最受欢迎的NoSQL数据库引擎之一。它以其可扩展性、性能、可靠性和易用性而闻名。在这篇文章中,我们将向你展示如何导入和导出你的MongoDB数据库。

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

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

先决条件

要完成本教程,你将需要以下东西。

第一步--将信息导入MongoDB

为了学习如何将信息导入MongoDB,我们将使用一个流行的关于餐馆的MongoDB样本数据库。它是.json格式,可以使用wget ,下载如下。

wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
复制代码

一旦下载完成,你应该在当前目录下有一个名为primer-dataset.json (12MB大小)的文件。让我们把这个文件中的数据导入一个新的数据库,命名为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()
复制代码

结果看起来是这样的。

[secondary label 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中的二进制日志一样,在最后一次备份后恢复你的数据。记住,备份通常在晚上进行。如果你决定在晚上恢复备份,你将会错过自上次备份以来的所有更新。

文章分类
代码人生
文章标签