介绍
MongoDB是最受欢迎的NoSQL数据库引擎之一。它以可扩展,强大,可靠和易于使用而闻名。在本文中,我们将向您展示如何导入和导出MongoDB数据库。
我们应该明确指出,本文中的导入和导出是指以人类可读的格式处理数据,与其他软件产品兼容。相反,备份和还原操作创建或使用MongoDB特定的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的MongoDB属性。因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。
在学习本教程之前,请确保完成以下先决条件:
sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。除非另有说明,否则本教程中需要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,将会出现所谓的“保真度丢失”。这就是备份/恢复的原因,最好使用能够更好地恢复MongoDB数据库的二进制bson。
其次,您不必担心显式创建MongoDB数据库。如果您指定用于导入的数据库尚不存在,则会自动创建该数据库。集合'(数据库表)结构的情况更好。与其他数据库引擎相比,在MongoDB中,再次在第一个文档(数据库行)插入时自动创建结构。
第三,在MongoDB中读取或插入大量数据(例如本文的任务)可能会占用大量资源并占用大量CPU,内存和磁盘空间。考虑到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会自动创建它。
让我们通过连接到这样调用的新创建的名为newdb
的MongoDB数据库来验证导入:
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信息,您可以获取包含数据的人类可读文本文件。默认情况下,信息以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服务器中不间断地继续运行MongoDB服务。复制的一部分也是操作日志(oplog),它记录了修改数据的所有操作。就像在MySQL中使用二进制日志一样,您可以使用此日志在上次备份完成后恢复数据。回想一下,备份通常在夜间进行,如果您决定在晚上恢复备份,则会丢失自上次备份以来的所有更新。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Import and Export a MongoDB Database on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。