作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。
介绍
MongoDB 是最受欢迎的 NoSQL 数据库引擎之一. 它以可扩展、强大、可靠和易于使用而闻名。 在本文中,我们将向您展示如何导入和导出您的 MongoDB 数据库。
我们应该澄清,通过导入和导出,我们指的是处理与其他软件产品兼容的可人读格式数据的操作,相反,备份和恢复操作会创建或使用 MongoDB 特定的二进制数据,从而保持数据的一致性和完整性以及其特定的 MongoDB 属性。
备份、恢复和迁移任务超出了本文的范围。 有关更多信息,请参阅 [Ubuntu 20.04 上的 MongoDB 数据库如何备份、恢复和迁移(LINK0))。
前提条件
要完成本教程,您将需要以下内容:
- 一个 Ubuntu 20.04 Droplet 根据 Ubuntu 20.04 初始服务器设置指南设置,包括一个 sudo 非根用户和防火墙。
- MongoDB 安装和配置使用文章 如何在 Ubuntu 20.04 上安装 MongoDB。
- 在 MongoDB 中理解 JSON 和 BSON 数据之间的差异。
步骤 1 — 将信息导入 MongoDB
要了解如何将信息导入 MongoDB 工作,让我们使用有关餐馆的流行的样本 MongoDB 数据库。
1wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
一旦下载完成,您应该在当前目录中有名为 primer-dataset.json
(大小为 12 MB)的文件. 让我们将该文件的数据导入到名为 newdb
的新数据库中,并导入到名为 restaurants
的集合中。
使用mongoimport
命令如下:
1sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
结果将是这样的:
1[secondary_label Output]
22020-11-11T19:37:55.607+0000 connected to: mongodb://localhost/
32020-11-11T19:37:57.841+0000 25359 document(s) imported successfully. 0 document(s) failed to import
正如上面的命令所示,已导入 25359 个文档,因为我们没有一个名为newdb
的数据库,所以 MongoDB 会自动创建它。
让我们来看看进口。
连接到新创建的newdb
数据库:
1sudo mongo newdb
您现在已连接到newdb
数据库实例. 请注意您的提示已更改,表示您已连接到数据库。
用命令计算餐厅收藏中的文件:
1db.restaurants.count()
结果将显示25359
,即导入文件的数量. 为了更好地检查,您可以选择餐厅收藏中的第一个文件,如下:
1db.restaurants.findOne()
结果将是这样的:
1[secondary_label Output]
2{
3 "_id" : ObjectId("5fac3d937f12c471b3f26733"),
4 "address" : {
5 "building" : "1007",
6 "coord" : [
7 -73.856077,
8 40.848447
9 ],
10 "street" : "Morris Park Ave",
11 "zipcode" : "10462"
12 },
13 "borough" : "Bronx",
14 "cuisine" : "Bakery",
15 "grades" : [
16 {
17 "date" : ISODate("2014-03-03T00:00:00Z"),
18 "grade" : "A",
19 "score" : 2
20 },
21...
22 ],
23 "name" : "Morris Park Bake Shop",
24 "restaurant_id" : "30075445"
25}
這樣的詳細檢查可能會揭示文件的問題,如其內容、編碼等 json 格式使用「UTF-8」編碼,您的出口和進口應該在這個編碼中。
要退出 MongoDB 提示,请在提示中输入退出
:
1exit
您将作为您的非根用户返回正常的命令行提示。
步骤 2 — 从 MongoDB 导出信息
正如我们之前提到的,通过导出 MongoDB 信息,您可以获得与您的数据一起可读的文本文件. 默认情况下,信息以 json 格式导出,但您也可以导出到 csv (comma 分隔值)。
若要从 MongoDB 导出信息,请使用mongoexport
命令. 它允许您导出一个非常精细的导出,以便您可以指定数据库、集合、字段,甚至用于导出一个查询。
一个简单的mongoexport
示例是从我们之前导入的newdb
数据库中导出餐厅收藏,可以这样做:
1sudo mongoexport --db newdb -c restaurants --out newdbexport.json
在上述命令中,我们使用--db
来指定数据库,-c
用于收集和--out
用于将数据保存到该文件。
成功的蒙古出口
的结果应该是这样的:
1[secondary_label Output]
22020-11-11T19:39:57.595+0000 connected to: mongodb://localhost/
32020-11-11T19:39:58.619+0000 [###############.........] newdb.restaurants 16000/25359 (63.1%)
42020-11-11T19:39:58.871+0000 [########################] newdb.restaurants 25359/25359 (100.0%)
52020-11-11T19:39:58.871+0000 exported 25359 records
上述结果显示,已经进口了25359份文件 - 与进口的文件数量相同。
在某些情况下,您可能只需要出口部分收藏品。考虑到餐厅 json 文件的结构和内容,让我们导出所有符合布朗克斯县和中国美食的标准的餐厅。
1sudo mongo newdb
然后,使用这个查询:
1db.restaurants.find( { "borough": "Bronx", "cuisine": "Chinese" } )
结果显示在终端:
1[secondary_label Output]
22020-12-03T01:35:25.366+0000 connected to: mongodb://localhost/
32020-12-03T01:35:25.410+0000 exported 323 records
要退出 MongoDB 提示,键入退出
:
1exit
如果您想从 sudo 命令行导出数据,而不是连接到数据库时,请将之前的查询作为mongoexport
命令的一部分,以此为-q
参数指定:
1sudo mongoexport --db newdb -c restaurants -q "{\"borough\": \"Bronx\", \"cuisine\": \"Chinese\"}" --out Bronx_Chinese_retaurants.json
请注意,我们在查询中使用反射(\
)来逃避双引用,同样,您必须逃避查询中的任何其他特殊字符。
如果出口成功,结果应该是这样的:
1[secondary_label Output]
22020-11-11T19:49:21.727+0000 connected to: mongodb://localhost/
32020-11-11T19:49:21.765+0000 exported 323 records
上面的结果表明,已导出 323 个记录,您可以在我们指定的 'Bronx_Chinese_retaurants.json' 文件中找到它们。
使用cat
和less
来扫描数据:
1cat Bronx_Chinese_retaurants.json | less
使用SPACE
通过数据页面:
1[secondary_label Output]
2date":{"$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}],
3
4. . .
现在您可以导入和导出 MongoDB 数据库。
结论
本文介绍了将信息导入和导出到MongoDB数据库的基本知识,您可以继续阅读如何在Ubuntu 20.04上备份、恢复和迁移MongoDB数据库
(LINK0)。
您也可以考虑使用复制。复制允许您继续从奴隶MongoDB服务器中不间断地运行MongoDB服务,而您正在从失败中恢复主服务器。复制的一部分是 操作日志(oplog),该日志记录了改变数据的所有操作。您可以使用此日志,就像您在MySQL中使用的二进制日志一样,在上次备份发生后恢复数据。请记住,备份通常在夜间进行,如果你决定在晚上恢复备份,你将错过上次备份以来所有更新。