在Ubuntu 14.04上如何导入和导出MongoDB数据库

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 在Ubuntu 14.04上如何导入和导出MongoDB数据库

MongoDB 是最流行的 NoSQL 数据库引擎之一。它以可扩展、强大、可靠和易于使用而闻名。在本文中,我们将向您展示如何导入和导出您的 MongoDB 数据库。

我们应该明确指出,在本文中,通过导入和导出,我们指的是处理以人类可读格式存储的数据,这种格式与其他软件产品兼容。相比之下,备份和恢复操作创建或使用特定于 MongoDB 的二进制数据,这不仅可以保持数据的一致性和完整性,还可以保留其特定的 MongoDB 属性。因此,对于迁移,通常最好使用备份和恢复,只要源和目标系统是兼容的。备份、恢复和迁移超出了本文的范围 - 请参阅《如何在 Ubuntu 14.04 上备份、恢复和迁移 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 的工具来进一步管理导出的数据,包括简单的文本编辑器。

一个示例的 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 的工作原理,让我们使用一个关于餐馆的流行示例 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 数据库实例。请注意,您的提示符已更改,表示您已连接到数据库。

使用以下命令计算餐馆集合中的文档数:

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 数据库中导出 restaurants 集合。可以这样做:

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 条记录 — 与导入的数量相同。

在某些情况下,您可能需要仅导出集合的一部分。考虑到 restaurants 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 数据库的基本知识。您可以继续阅读《在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库》和《如何设置可扩展的 MongoDB 数据库》。

复制不仅对可扩展性有用,而且对当前主题也很重要。复制允许您在从故障中恢复主服务器时,从从属 MongoDB 服务器中无间断地继续运行 MongoDB 服务。复制的一部分还是操作日志(oplog),它记录修改数据的所有操作。您可以像在 MySQL 中使用二进制日志一样使用此日志,在最后一次备份后恢复数据。请记住,备份通常在夜间进行,如果您决定在晚上恢复备份,您将错过自上次备份以来的所有更新。


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
13天前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
13天前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
2月前
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
51 4
|
6天前
|
存储 NoSQL 前端开发
前端轻量级数据库mongodb
【10月更文挑战第2天】MongoDB 是一个基于分布式文件存储的开源数据库系统,不属于前端轻量级数据库,而是后端数据库。它使用 BSON 格式存储数据,支持复杂的数据结构,适用于内容管理系统、物联网等领域。MongoDB 通过动态模式和面向对象的数据存储方式,提供了灵活的数据模型。在 Web 应用中,它通常作为后端存储,通过 API 与前端交互,实现高效的数据管理和实时更新。
|
12天前
|
JSON NoSQL MongoDB
MongoDB批量导出导入操作的示例
使用 `mongoexport`和 `mongoimport`工具可以方便地对MongoDB数据库进行批量数据的导出和导入操作。它们支持多种格式和灵活的选项,使得数据迁移、备份和同步变得简单快捷。在实际应用中,根据具体的需求和数据特性选择合适的命令和选项是非常重要的,这将确保数据处理的效率和准确性。
28 1
|
10天前
|
SQL 关系型数据库 MySQL
Python小技巧——将CSV文件导入到MySQL数据库
Python小技巧——将CSV文件导入到MySQL数据库
13 0
|
2月前
|
关系型数据库 MySQL 大数据
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
|
2月前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
53 0
|
2月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
43 0
|
2月前
|
存储 SQL NoSQL
探索数据存储的多样性:深入比较Entity Framework Core与NoSQL数据库MongoDB的特性与应用
【8月更文挑战第31天】在现代软件开发中,选择合适的数据存储方案对应用性能至关重要。本文通过对比Entity Framework Core(EF Core)和MongoDB,探讨两者的特点及适用场景。EF Core作为.NET生态中的ORM,简化了SQL数据库的交互;MongoDB则是一种灵活的NoSQL文档数据库,适合处理大量非结构化数据。两者在数据模型、查询方式及性能上各有优势,选择时需根据具体应用需求决定。理解这些差异有助于做出更合理的技术选型。
33 0
下一篇
无影云桌面