MongoDB (六) 开发最佳实践

1.1、关于连接到MongoDB

  • 关于驱动程序:总是选择与所用之 MongoDB 相兼容的驱动程序。这可以很容易地从驱动兼容对照表中查到;
  • 如果使用第三方框架(如 Spring Data),则还需要考虑框架版本与驱动的兼容性;
  • 关于连接对象 MongoClient:使用 MongoClient 对象连接到 MongoDB 实例时总是应该保证它单例,并且在整个生命周期中都从它获取其他操作对象。
  • 关于连接字符串:连接字符串中可以配置大部分连接选项,建议总是在连接字符串中配置这些选项;

// 连接到复制集

mongodb://节点1,节点2,节点3…/database?[options]

// 连接到分片集

mongodb://mongos1,mongos2,mongos3…/database?[options]

1.1.1、常见连接字符串参数

  • maxPoolSize:连接池大小
  • Max Wait Time: 建议设置,自动杀掉太慢的查询
  • Write Concern: 建议 majority 保证数据安全
  • Read Concern:对于数据一致性要求高的场景适当使用

1.1.2、连接字符串节点和地址

  • 无论对于复制集或分片集,连接字符串中都应尽可能多地提供节点地址,建议全部列出;

    • 复制集利用这些地址可以更有效地发现集群成员;

    • 分片集利用这些地址可以更有效地分散负载;

    • 连接字符串中尽可能使用与复制集内部配置相同的域名或 IP;

1.1.3、使用域名连接集群

在配置集群时使用域名可以为集群变更时提供一层额外的保护。例如需要将集群整体迁移到新网段,直接修改域名解析即可。另外,MongoDB 提供的 mongodb+srv:// 协议可以提供额外一层的保护。该协议允许通过域名解析得到所有 mongos 或节点的地址,而不是写在连接字符串中。

1.1.4、不要在 mongos 前面使用负载均衡

基于前面提到的原因,驱动已经知晓在不同的 mongos 之间实现负载均衡,而复制集则需要根据节点的角色来选择发送请求的目标。如果在 mongos 或复制集上层部署负载均衡;

  • 驱动会无法探测具体哪个节点存活,从而无法完成自动故障恢复;
  • 驱动会无法判断游标是在哪个节点创建的,从而遍历游标时出错;

结论:不要在 mongos 或复制集上层放置负载均衡器,让驱动处理负载均衡和自动故障恢复。

1.1.5、游标使用

如果一个游标已经遍历完,则会自动关闭;如果没有遍历完,则需要手动调用 close()方法,否则该游标将在服务器上存在 10 分钟(默认值)后超时释放,造成不必要的资源浪费。但是,如果不能遍历完一个游标,通常意味着查询条件太宽泛,更应该考虑的问题是如何将条件收紧。

1.2、关于查询及索引

  • 每一个查询都必须要有对应的索引
  • 尽量使用覆盖索引 Covered Indexes (可以避免读数据文件)
  • 使用 projection 来减少返回到客户端的的文档的内容

1.3、关于写入

  • 在 update 语句里只包括需要更新的字段
  • 尽可能使用批量插入来提升写入性能
  • 使用TTL自动过期日志类型的数据

1.4、关于文档结构

  • 防止使用太长的字段名(浪费空间)
  • 防止使用太深的数组嵌套(超过2层操作比较复杂)
  • 不使用中文,标点符号等非拉丁字母作为字段名

1.5、处理分页问题 – 避免使用 count

尽可能不要计算总页数,特别是数据量大和查询条件不能完整命中索引时。考虑以下场景:假设集合总共有 1000w 条数据,在没有索引的情况下考虑以下查询:db.coll.find({x: 100}).limit(50);db.coll.count({x: 100});

  • 前者只需要遍历前 n 条,直到找到 50 条队伍 x=100 的文档即可结束;
  • 后者需要遍历完 1000w 条找到所有符合要求的文档才能得到结果。

为了计算总页数而进行的 count() 往往是拖慢页面整体加载速度的原因

1.6、处理分页问题 – 巧分页

避免使用skip/limit形式的分页,特别是数据量大的时候;

替代方案:使用查询条件+唯一排序条件;

第一页:db.posts.find({}).sort({_id: 1}).limit(20);
第二页:db.posts.find({_id: {$gt: <第一页最后一个_id>}}).sort({_id: 1}).limit(20);
第三页:db.posts.find({_id: {$gt: <第二页最后一个_id>}}).sort({_id: 1}).limit(20);

1.7、关于事务

使用事务的原则:

  • 无论何时,事务的使用总是能避免则避免;
  • 模型设计先于事务,尽可能用模型设计规避事务;
  • 不要使用过大的事务(尽量控制在 1000 个文档更新以内);
  • 当必须使用事务时,尽可能让涉及事务的文档分布在同一个分片上,这将有效地提高效率;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: mongodb是一个非常流行的NoSQL数据库,并且已经成为很多开发者和企业的首选。与传统的关系型数据库相比,mongodb具有许多优势,例如可扩展性、高性能、灵活性等等。 如果你想学习mongodb,那么你可以从官方文档开始,它提供了非常详细的入门教程和完整的API文档,能够帮助你快速掌握mongodb的基础概念和使用方法。 除了官方文档外,还有许多优秀的mongodb学习资源可供选择。例如,网上有大量的教程、博客和视频教程,可以帮助你更深入地了解mongodb的使用和最佳实践。 另外,参加mongodb的社区活动也是很有帮助的。可以在官方网站上找到mongodb社区的论坛、开发者群、问题解答等资源,与其他开发者互动,分享经验和资源,能够更全面地学习mongodb。 总之,想要掌握mongodb,需要不断学习,不断实践。通过不断探索和运用,才能掌握mongodb的核心概念和应用技巧,更好地为项目和业务提供支持。 ### 回答2: MongoDB 是一款非常流行的 NoSQL 数据库,相比于传统的 SQL 数据库,它的特点是更加灵活和可扩展。学习 MongoDB 的手册需要掌握以下内容: 首先,需要掌握 MongoDB 的基础概念,包括集合,文档,索引等。MongoDB 是文档型数据库,不同于关系型数据库,它采用了更加自由的 schema-less 的模式,即文档并不需要保持相同的结构。掌握这些基本概念是了解 MongoDB 的基础,也是将 NoSQL 和 SQL 数据库进行比较更好的思想准备。 其次,需要了解 MongoDB 的安装和配置。MongoDB 可以轻松运行在 Linux,Windows 和 Mac 等系统上,并且提供了一组强大的工具来管理数据库,如自带的 shell 和命令行接口。了解如何正确地安装并配置 MongoDB 是学习 MongoDB 的重要部分。 接下来,需要学习 MongoDB 的数据操作语言,MQL。 要能够理解如何使用 MQL 管理索引、文档、集合和数据库。MQL可以使您在MongoDB中找到您需要的数据信息,并进行相应的操作,例如添加,更新,删除等。 最后,学习 MongoDB 编程模型。MongoDB 提供了多种编程语言的驱动程序,例如 Python,Java,Node.js,PHP 等,以及一些流行的框架,如 Spring Data MongoDB,Mongoose 等。熟悉这些工具是学习 MongoDB 编程模式的关键,可以加速开发过程和提高应用程序的性能。 总之,MongoDB 是一种非常有用的数据库,它们为开发人员提供了易于使用的方式来管理和存储数据。通过学习 MongoDB 的手册,你将能够了解 MongoDB 基础知识并能够开始使用这种数据库来构建高效和可扩展的应用程序。 ### 回答3: MongoDB学习手册是一本介绍MongoDB数据库的书籍。MongoDB是一种文档数据库,它的特点是数据以文档的形式来存储,和传统的关系型数据库有所不同。阅读MongoDB学习手册可以帮助读者了解MongoDB的基础知识,掌握其使用方法,包括数据的查询、插入和更新等操作。此外,学习手册还介绍了一些高级功能,例如MongoDB的聚合框架和地理空间查询等功能,这些功能可以帮助开发人员构建更复杂的应用程序。MongoDB学习手册还讲述了如何使用MongoDB来构建分布式系统,以及如何处理复杂的数据类型和索引。学习手册还介绍了MongoDB最佳实践和安全措施,以帮助读者避免一些与数据库相关的问题。总之,MongoDB学习手册是一本值得阅读的书籍,它可以帮助开发人员和数据科学家了解MongoDB的基础知识及其使用方法,并且能够为他们构建稳健的应用程序提供更多的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Julywhj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值