MongoDB是最流行的NoSQL数据库引擎之一。 它是着名的是可扩展,强大,可靠和易于使用。 在本文中,我们将向您介绍如何导入和导出MongoDB数据库。
我们应该明确,通过本文中的导入和导出,我们的意思是以人类可读的格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留数据的一致性和完整性,而且保留其特定的MongoDB属性。 因此,对于迁移,只要源系统和目标系统兼容,通常优选使用备份和恢复。 备份,恢复和迁移已经超出了本文的范围-是指如何备份,还原和迁移MongoDB数据库在Ubuntu 14.04 。
先决条件
在遵循本教程之前,请确保您满足以下先决条件:
- 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的任何工具进一步管理导出的数据,包括简单的文本编辑器。
示例json文档如下所示:
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
Json非常方便使用,但它不支持所有在bson中可用的数据类型。 这意味着如果你使用json,将会有信息的所谓“失去保真”。 这就是为什么备份/恢复最好使用二进制bson,这将能够更好地还原您的MongoDB数据库。
第二,你不必担心显式创建MongoDB数据库。 如果您指定要导入的数据库不存在,则会自动创建。 更好的情况是集合(数据库表)结构。 与其他数据库引擎相反,在MongoDB中,结构再次在第一个文档(数据库行)插入时自动创建。
第三,在MongoDB读取或插入大量数据,例如对于本文的任务,可能是资源密集型,消耗大量的CPU,内存和磁盘空间。 考虑到MongoDB经常用于大型数据库和大数据,这是非常关键的。 对这个问题最简单的解决方案是在夜间运行exports / backups。
第四,如果您有一个繁忙的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
结果应如下所示:
2016-01-17T14:27:04.806-0500 connected to: localhost
2016-01-17T14:27:07.315-0500 imported 25359 documents
如上面的命令所示,已导入25359个文档。 因为我们没有一个数据库,称为newdb
,MongoDB的创建它自动。
让我们通过连接到名为新创建的MongoDB数据库验证导入newdb
是这样的:
sudo mongo newdb
你现在被连接到新创建的newdb
数据库实例。 请注意,您的提示已更改,表示您已连接到数据库。
使用命令计算restaurants集合中的文档:
db.restaurants.count()
结果应该展会上25359
,进口单据数完全。 为了更好的检查,您可以从餐馆集合中选择第一个文档,如下所示:
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
应该是这样的:
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命令行,而不是同时连接到数据库中导出,使以前的查询部分mongoexport
通过指定它的命令-q
这样的说法:
sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
请注意,我们在查询条件的双引号内使用单引号。 如果使用双引号或特殊字符,如$
,你将不得不与反斜杠(逃避他们\
查询)。
如果导出成功,结果应如下所示:
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数据库导入和导出信息的要点。 您可以继续在进一步阅读如何备份,还原和迁移MongoDB数据库在Ubuntu 14.04和如何建立一个可伸缩的MongoDB数据库 。
复制不仅对可扩展性有用,而且对当前主题也很重要。 复制允许您从一个从属MongoDB服务器不间断地继续运行您的MongoDB服务器,同时从失败中恢复主服务器。 复制的部分也是操作日志(OPLOG) ,记录所有修改数据的操作。 您可以使用此日志,就像使用MySQL中的二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在夜间进行,如果您决定在晚上恢复备份,则将缺少自上次备份以来的所有更新。