MongoDB 是最受欢迎的 NoSQL 数据库引擎之一. 它以可扩展、强大、可靠和易于使用而闻名。 在本文中,我们将向您展示如何导入和导出您的 MongoDB 数据库。
我们应该澄清,在本文中,通过导入和导出,我们指的是处理与其他软件产品兼容的人读格式的数据,相反,备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的MongoDB属性。因此,对于迁移,通常最好使用备份和恢复,只要源和目标系统是兼容的。
前提条件
在遵循本教程之前,请确保您完成以下先决条件:
- Ubuntu 14.04 Droplet
- 非 root sudo 用户. 查看 初始服务器设置与 Ubuntu 14.04 有关详细信息。
- MongoDB 安装和配置使用文章 如何在 Ubuntu 14.04 上安装 MongoDB。
除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。
了解基本
如果你有经验使用流行的关系数据库系统,如MySQL,你可能在使用MongoDB时会发现一些相似之处。
首先你应该知道的是,MongoDB 使用 json 和 bson (二进制 json) 格式来存储其信息。Json 是人文可读的格式,非常适合导出并最终导入您的数据。
一个 json 文档的例子看起来像这样:
1[label Example of json Format]
2{"address":[
3 {"building":"1007", "street":"Park Ave"},
4 {"building":"1008", "street":"New Ave"},
5]}
Json 非常方便,但它不支持 bson 中的所有数据类型,这意味着如果您使用 json,将出现所谓的信息忠诚度损失
。
其次,你不必担心明示地创建MongoDB数据库。如果你指定导入的数据库已经不存在,它会自动创建。更糟糕的是集合(数据库表)的结构。 与其他数据库引擎不同,在MongoDB中,结构在第一个文档(数据库行)插入时再次自动创建。
第三,在MongoDB中读取或插入大量数据,例如对于本文中的任务,可以耗费大量资源,消耗大量的CPU、内存和磁盘空间。
第四,如果您有一个繁忙的 MongoDB 服务器,信息在数据库导出过程中发生变化,信息的一致性可能是有问题的,但在本文的末尾,您将看到有关复制的进一步阅读的建议。
将数据导入 MongoDB
要了解如何将信息导入 MongoDB 工作,让我们使用有关餐馆的流行的样本 MongoDB 数据库。
1wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
一旦下载完成,你应该在当前目录中有一个名为primer-dataset.json
的文件(大小为12 MB)。让我们从这个文件中导入数据到一个名为newdb
的新数据库,并将其导入到一个名为restaurants
的集合中。
1sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
结果应该是这样的:
1[label Output of mongoimport]
22016-01-17T14:27:04.806-0500 connected to: localhost
32016-01-17T14:27:07.315-0500 imported 25359 documents
正如上面的命令所示,已导入 25359 个文档,因为我们没有一个名为newdb
的数据库,所以 MongoDB 会自动创建它。
让我们通过这样连接到新创建的 MongoDB 数据库来验证导入:
1sudo mongo newdb
您现在已连接到新创建的newdb
数据库实例,请注意您的提示已更改,表示您已连接到数据库。
用命令计算餐厅收藏中的文件:
1db.restaurants.count()
結果應該顯示為「25359」,正確是輸入的文件數目。 為了更好的檢查,您可以選擇餐廳收藏中的第一份文件,如下:
1db.restaurants.findOne()
结果应该是这样的:
1[label Output of db.restaurants.findOne()]
2{
3 "_id" : ObjectId("569beb098106480d3ed99926"),
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
您将作为您的非根用户返回正常的命令行提示。
从 MongoDB 导出信息
正如我们之前提到的,通过导出 MongoDB 信息,您可以获得与您的数据一起可读的文本文件. 默认情况下,信息以 json 格式导出,但您也可以导出到 csv (comma 分隔值)。
若要从 MongoDB 导出信息,请使用mongoexport
命令. 它允许您导出一个非常精细的导出,以便您可以指定数据库、集合、字段,甚至用于导出一个查询。
一个简单的mongoexport
示例是从我们之前导入的newdb
数据库中导出餐厅收藏,可以这样做:
1sudo mongoexport --db newdb -c restaurants --out newdbexport.json
在上述命令中,我们使用--db
来指定数据库,-c
用于收集和--out
用于将数据保存到该文件。
成功的蒙古出口
的结果应该是这样的:
1[label Output of mongoexport]
22016-01-20T03:39:00.143-0500 connected to: localhost
32016-01-20T03:39:03.145-0500 exported 25359 records
上述结果显示,已经进口了25359份文件 - 与进口的文件数量相同。
在某些情况下,您可能只需要出口部分收藏品。考虑到餐厅 json 文件的结构和内容,让我们导出所有符合布朗克斯县和中国美食的标准的餐厅。
1sudo mongo newdb
然后,使用这个查询:
1db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
结果显示在终端上. 要退出 MongoDB 提示,请在提示中输入 exit
:
1exit
如果您想从 sudo 命令行导出数据,而不是连接到数据库时,请将之前的查询作为mongoexport
命令的一部分,以此为-q
参数指定:
1sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
请注意,我们正在为查询条件使用双引文中的单引文. 如果您使用双引文或特殊字符,如$
,则必须在查询中用反射(``)逃避它们。
如果出口成功,结果应该是这样的:
1[label Output of mongoexport]
22016-01-20T04:16:28.381-0500 connected to: localhost
32016-01-20T04:16:28.461-0500 exported 323 records
上面的结果表明,已导出 323 个记录,您可以在我们指定的 'Bronx_Chinese_retaurants.json' 文件中找到它们。
结论
您可以继续阅读关于如何在Ubuntu 14.04上备份,恢复和迁移MongoDB数据库(How To Back Up, Restore, and Migrate a MongoDB Database on Ubuntu 14.04)(https://andsky.com/tech/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-14-04)和如何设置可扩展的MongoDB数据库(https://andsky.com/tech/tutorials/how-to-set-up-a-scalable-mongodb-database)。
复制不仅对可扩展性有用,而且对当前主题也很重要。复制允许您继续从奴隶MongoDB服务器中不间断地运行MongoDB服务,而您正在从失败中恢复主机。复制的一部分也是 操作日志(oplog),该日志记录了修改数据的所有操作。您可以使用此日志,就像您在MySQL中使用二进制日志一样,在上次备份发生后恢复数据。