对刚刚接触 MongoDB 的人来说, MongoDB就是一个NoSQL类型的文档数据库. 文档中包含的键值对,构成了MongoDB的数据基本单位。

不过可以肯定的是MongoDB的确是当前最流行的NoSQL数据库. 它已被广泛接受并且适合各种各样的场合 (尽管不是所有项目都使用它)。

这篇文章中,我将根据过去几年来我使用MongoDB所得出的经验,简短的介绍下MongoDB的好处、坏处和它丑陋的地方。

好处

自 MongoDB 流行以来,它的好处应该多于坏处和丑陋的地方. 如若不是,开发者们也不会接受它. 下面是一些MongoDB好的方面。

灵活的数据模型

当今动态的用户案例以及不断变化的应用,拥有一个灵活的数据模型是一种福音。灵活的数据模型意味着没有预先定义的模式,文档可以基于任何键值持有任何值的集合。

富有表现力的查询语法

MongoDB的查询语句是非常具有表现力且易于理解的。许多人会说这不像SQL语句。但是当我们能向前发展,且查询语句更简单并具表现力的时候,为什么我们还要坚持类似SQL的查询语句呢?

容易学习

MongoDB很容易学习,并且能快速上手。基本的安装、执行不会超过几个小时。 更强大的设置可能是复杂的,但是我会晚点再谈论这方面。

根据上面这些特点想必你应该很容易把它揉进你的项目中。

性能

查询性能是MongoDB的长处. 它把大多数可操作的数据存储在内存中. 所有的数据是固化在硬盘中的, 但在查询过程中, 它不会从硬盘中过去数据(那样太慢). 它直接从本地内存中获取数据,因此速度就会更快. 所以,为数据设置正确的索引并且提供足够的内存便能发挥MongoDB的性能优势。

可伸缩性和可靠性

MongoDB 具有很高的可伸缩性, 在碎片数据使用方面. 横向可伸缩性在大多数NoSQL数据库中是一大亮点. MongoDB 也不例外。

它也是高度可靠的,因为它的副本集数据被异步的复制到更多的节点。

异步驱动

对于所有的现代应用程序而言使用异步的非阻塞IO是提速的关键。MongoDB异步驱动程序支持最流行的语言。

文档

拥有一个良好的文档可以让开发人员的生活变得容易很多,特别是当开发人员面对的是新技术。MongoDB有出色的文档。

文本搜索

如果你正在建设一个网站, 需要搜索您的所有数据,文本搜索是必不可少的。例如,一个使用具有文本搜索的数据库的电子商务网站对用户来说更有利。

服务端脚本

如果你有一些操作需要在服务端而不是应用端执行,在MongoDB中,你可以那么做。把mongo语句放在一个.js文件中,并用mongo命令执行js文件。

文档 = 对象

文档数据库的优点是对象可以在MongoDB中存储为一个单独的文档。 这边不需要对象关系映射(ORM)。

缺点

我们已经看到了有关MongoDB的各种优点,接下来要说下缺点了。我敢肯定批评家对这部分更感兴趣。如果使用不当,MongoDB可能会做坏事。

现今,实际上很少有应用程序需要事务,但是有一些程序还是需要的。不幸的是, MongoDB不支持事务。因此当一个请求中需要修改多个文档或多个集合时就不要使用MongoDB。由于没有ACID保证它可能会导致数据损坏。回滚操作必须由你的应用程序来处理。

没有触发器

在关系式数据库中,有触发器,在很多情况下它是十分有用的。但是在MongoDB中就没这个了。

存储

相比其他流行的数据库MongoDB需要更多的存储。 在 MongoDB 3.0中引入的WiredTiger解决了这个问题,但是对于大多数应用程序来说使用WiredTiger不甚理想。

磁盘清理

MongoDB不会自动清理磁盘空间。因此如果文档被修改了或删除了,磁盘空间不会被释放。你必须通过手动或重启来释放。

丑陋的

有时,丑陋可能比坏更糟糕。使用一项技术之前了解它的不足是很重要的。它不会阻止你使用它,但它可以让你的活的非常艰难。

层次结构

如果你有一个是递归包含孩子数据对象的数据模型 (如, 一个对象拥有与它相同数据类型的孩子对象并且层级很多), MongoDB的文档结构就会变得非常丑陋。对这些递归嵌入的文档进行索引、搜索和排序将非常困难。

Join(连接)

MongoDB中join两个文档是不容易的,虽然MongoDB 3.2支持左外连接 (lookup), 但它尚未成熟。如果你的应用程序需要在一个查询中实现获取多个集合中的数据,那可能无法实现。因此你必须使多个查询,这可能会让你的代码看起来有点乱。

索引

虽然MongoDB标榜速度是它的一大亮点,但它依赖于你建立了正确的索引。如果你建立的索引很糟糕或不正确顺序的复合索引,那么 MongoDB可能是最慢的数据库。

如果你有很多的过滤条件和排序字段,你可能会在一个集合上建立很多的索引,当然这是不好的一个做法。

重复数据

你可能会有大量重复的数据,MongoDB不支持关系式。修改这些重复数据可能会比较困难,且由于缺少事务支持,我们还可能会损坏数据。

结论

综述,只要你恰当的使用,MongoDB是一个优秀的数据库,否则它会给你带来麻烦。在不恰当的地方使用它你将会吃到苦头。

认真的分析以及咨询专家。正确的使用你绝对会爱上它。

至于坏的和丑陋的部分,你可以一些使用设计模式来解决其中的一些问题,在我的文章解释了 MongoDB设计模式。

MongoDB的最佳实践

下面列出了几个MongoDB的最佳实践:

硬件

  • 确保你的数据集能放入内存中

使用压缩

  • 每台服务器运行单个MongoDB
  • 对于写入数据较多的应用使用固态硬盘

数据模型

  • 一条记录的所有数据都存在一个文档中
  • 避免大尺寸的文档
  • 避免不必要的长字段名
  • 去掉不必要的索引
  • 删除其它索引前缀的索引

应用程序

  • 只修改变化的字段
  • 避免否定式查询
  • 对于复杂的查询运行explain()(查看执行计划)
  • 在可能的情况下使用覆盖查询.
  • 在需要的时候使用批量插入.

安装和配置

  • 拥有至少一个从库和一个仲裁
  • 当数据非常重要时应设置参数 write concern 为2
  • 有每日的数据转储备份。
  • 本文作者:Darel Lasrado
  • 来源:51CTO

论:MongoDB的好坏丑相关推荐

  1. [译] 代码中添加注释之好坏丑

    原文地址:Putting comments in code: the good, the bad, and the ugly. 原文作者:Bill Sourour 译文出自:掘金翻译计划 译者: ba ...

  2. MongoDB的设计模式策略

    原文:MongoDB Design Patterns 作者: Darel Lasrado 译者:仲培艺,关注数据库领域,纠错.寻求报道或者投稿请致邮:zhongpy@csdn.net. MongoDB ...

  3. 绝对值得收藏的十位电影配乐大师 (上)

    TOP1:电影音乐的王者--- 约翰·威廉姆斯(John Williams) 电影配乐大师约翰.威廉姆斯是电影配乐家中的佼佼者,曾超过24次获得奥斯卡金像奖最佳配乐提名,并5次获奖.同时,他的配乐还1 ...

  4. python mongodb orm_Django 通过 mongoengine 连接 MongoDB 进而使用orm进行CRUD

    一. 在python脚本中, 我们通常可以使用pymongo模块实现与mongodb数据库的交互, 但是在使用Django框架进行定制开发的web server 项目中, 仍然使用pymongo模块的 ...

  5. 练习 MongoDB 操作 —— 分片篇(五)

    分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程.在关系型数据库中,当一个表太大(超过几亿行数据)时,我们也有分表的做法,和这里的分片是类似的概念. 术语 "片&quo ...

  6. MongoDB 数据分发

    在MongoDB(版本 3.2.9)中,数据的分发是指将collection的数据拆分成块(chunk),分布到不同的分片(shard)上,数据分发主要有2种方式:基于数据块(chunk)数量的均衡分 ...

  7. mongodb数据库淘汰_MongoDB 等 NoSQL 与关系型数据库相比,有什么优缺点及适用场景?...

    利益相关:MongoDB 员工,开发 MongoDB 数据库 5 年.十年前,当 Dwight 和我开始这个后来成为 MongoDB 的项目的时候,我们绝对没有想到它今天的样子.我们只有一个信念:让开 ...

  8. MongoDB集群之分片技术应用 —— 学习笔记

    课程链接:https://www.imooc.com/learn/501 一.什么是分片? 分片:将数据进行2拆分,将数据水平的分散到不同的服务器上. 二.为什么要分片? 架构上:读写均衡.去中心化 ...

  9. 一个 Vue + Node + MongoDB 博客系统

    源码 耗时半载(半个月)的大项目终于完成了.这是一个博客系统,使用 Vue 做前端框架,Node + express 做后端,数据库使用的是 MongoDB.实现了用户注册.用户登录.博客管理(文章的 ...

最新文章

  1. matlab动力学方程,机器人动力学方程(二):拉格朗日法
  2. AI工程师面试知识点:机器学习算法类
  3. 【Java TreeMap】测试TreeMap的使用、Comparabe自定义类的自定义排序方式
  4. 网站攻击软件_如何防止网站建设中出现安全问题?
  5. python3 虚拟环境 pip 版本_【python知识】 - Python3之PIPENV虚拟环境及封装
  6. CSS3黑色大气绘图着陆页模板
  7. 从ASP.NET Core 3.1中的当前URL获取主机信息
  8. Boost.Asio的网络编程
  9. 罗永浩回应做主播赚钱还债;360 否认裁员;Kubernetes 1.18 版本发布| 极客头条
  10. 开源巨献:2017 年 Google 开源了这些超赞的项目
  11. CentOS 安装Python3.x常见问题
  12. 序列化(写对象)与反序列化(读对象)
  13. 《21天学通C语言(第7版)》一6.4 小 结
  14. rssi参数获取_如何获取WlanGetNetworkBssList函数返回值的Rssi值
  15. 高中会考计算机试题及答案,高中计算机会考试题及答案
  16. Linux操作系统下的权限设置
  17. 面向智能网联汽车边缘网络的分布式端-边协同算法
  18. matlab在stem的运用
  19. EOS映射的坑——存钱包用户必看
  20. USACO 2020 February Contest, Gold

热门文章

  1. 微信公众号如何关联小程序?如何查看小程序原始ID?
  2. Python基础—with语法以及数据类型转换
  3. 官宣:3月27日的PMP考试,确定延期至6月、7月
  4. 学计算机基础规划500字,计算机学习计划范文
  5. css代码转stylus
  6. Pycharm 常用快捷键 for Mac
  7. 苹果收购英特尔调制解调器业务,角力5G胜算几何?
  8. 其实 家用计算机与普通计算机,拆解服务器,看看与普通计算机到底有什么区别?...
  9. 配置目标跟踪开源项目traj_gen_vis踩过的坑
  10. StarRocks 3.0 极速统一的湖仓新范式