MongoDB入门实战教程(14)
MongoDB入门实战教程转眼就到了尾声,本篇我们就来总结一下MongoDB的应用开发最佳实践。
1 关于MongoDB的连接
(1)MongoDB Driver:我们最好选择与所用MongoDB服务器版本一致或相兼容的Driver版本。
(2)MongoClient:在应用程序中使用MongoClient对象连接到MongoDB实例时,应该保证它是单例,并且在整个生命周期中都从它获取其他操作对象(如Database,Collection等)。
(3)ConnectionString:建议在连接字符串中配置大部分连接默认选项,如maxPoolSize,readConcern,writeConcern等。
// 连接到复制集
mongodb://节点1,节点2,节点3…/database?[options]
// 连接到分片集
mongodb://mongos1,mongos2,mongos3…/database?[options]
常见的连接字符串参数有:
maxPoolSize :连接池大小
maxWaitTime:最大等待时间,建议设置,自动杀掉太慢的查询
writeConcern:建议设置为majority 保证数据安全
readConcern:对于数据一致性要求较高的场景适当使用
对于连接字符串中的节点和地址:
无论对于复制集或分片集,连接字符串中建议全部列出所有节点地址
连接字符串中尽可能使用与复制集内部配置相同的域名或IP地址,建议均使用域名
不要在mongos前面使用负载均衡:MongoDB Driver自己会处理负载均衡和自动故障恢复,不要在mongos或复制集上层放置负载均衡器(比如LVS或Nginx),否则Driver会无法探测具体哪个节点存活,也无法判断游标是在哪个节点创建的。
2 关于查询 和 索引
(1)每一个查询都必须要有对应的索引,尽量使用覆盖索引(Covered Indexes),这样可以避免读数据文件。
(2)尽量对每个查询都使用projection(投影操作)来减少返回到客户端的文档的内容大小。
3 关于写入
(1)在update语句里只包括需要更新的字段
(2)尽可能使用批量插入(如InsertMany)来提升写入性能
(3)使用TTL自动过期日志类型的数据
4 关于文档结构
(1)防止使用太长的字段名(这样比较浪费空间)
(2)防止使用太深的数组嵌套(超过2层操作比较复杂)
(3)不使用中文,标点符号等非拉丁字母作为字段名
5 关于事务
使用事务的基本原则:
(1)能避免使用就尽量避免使用
(2)模型设计先于事务,尽可能用模型设计来规避事务
(3)不要使用过大的事务(尽量控制在1000个文档更新以内)
(4)当必须要使用事务时,尽可能让涉及事务的文档分布在同一个分片上,这将有效地提高效率
6 关于分页
使用分页的基本原则:能不用分页就不用分页。
如果非要用分页:
(1)尽量避免使用count,特别是在文档量很大 以及 查询条件不能完整命中索引 的时候。这时候,计算count()往往是拖慢页面整体加载速度的最大原因。
(2)尽量避免使用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);
……
7 总结
本文简单介绍了一些MongoDB的应用开发最佳实践,了解和应用这些最佳实践对于我们在日常项目开发中大有裨益。
至此,MongoDB入门实战教程系列文章也就结束了,希望能够对你有所帮助。
最后,感谢本文的参考资料《MongoDB高手课》,我完整学习完了该课程,也把它推荐给你!
参考资料
唐建法,《MongoDB高手课》(极客时间)
郭远威,《MongoDB实战指南》(图书)
△推荐订阅学习
MongoDB入门实战教程(14)的更多相关文章
- duilib教程之duilib入门简明教程14.部分bug 2
上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_t ...
- Kafka入门实战教程(7):Kafka Streams
1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱 ...
- ZooKeeper入门实战教程(一)-介绍与核心概念
1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...
- Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门
前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...
- MongoDB入门必读(概念与实战并重)
MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...
- mongodb入门教程
title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...
- MongoDb 入门教程
MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建
前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
随机推荐
- 探秘Transformer系列之(20)--- KV Cache
探秘Transformer系列之(20)--- KV Cache 目录 探秘Transformer系列之(20)--- KV Cache 0x00 概述 0x01 自回归推理的问题 1.1 请求的生命 ...
- SQLite 下载与安装
安装 SQLite 官网 就2个文件,下载解压到一起即可 这里不是安装包的形式,下载后是下面这2个文件: 解压到同一目录下即可,如图: "安装"完成后,记得添加系统环境变量,以便命 ...
- xe10.3+paserver在Ubuntu下运行错误
xe.3的paserver在Ubuntu下执行呈现乱七八糟的错误提示. 原因:Ubuntu的版本和paserver编译的环境不一致. 注意:使用ARM64的版本.如ubuntu-18.04.2-des ...
- 探秘Transformer系列之(23)--- 长度外推
探秘Transformer系列之(23)--- 长度外推 目录 探秘Transformer系列之(23)--- 长度外推 0x00 概述 0x01 背景 1.1 问题 1.2 解决思路 1.3 微调的 ...
- 基于源码分析 HikariCP 常见参数的具体含义
HikariCP 是目前风头最劲的 JDBC 连接池,号称性能最佳,SpringBoot 2.0 也将 HikariCP 作为默认的数据库连接池. 要想用好 HikariCP,理解常见参数的具体含义至 ...
- 【work记录:c++web聊天服务器】解决了聊天窗口的问题|修复了"没有区分好友或者群聊的聊天窗口"的bug|修复了"群聊消息undefined"的bug
日期:2025.4.24 学习内容: 解决了聊天窗口的问题 修复了"没有区分好友或者群聊的聊天窗口"的bug 修复了"群聊消息undefined"的bug 个人 ...
- 《Universal Number Posit Arithmetic Generator on FPGA》(一)
A parameterized Verilog HDL is constructed for each unit which takes posit word size (N) and posit e ...
- mysql8.0.12+hibernate5.4.1 的一些配置
目录 整体目录结构 第一步 创建数据库 第二步 创建java项目,导入相应的jar包 第三步 创建数据库对应的java类 第四步 创建hibernate映射文件 第五步 创建hibernate核心配置 ...
- 信息资源管理综合题之“LJ集团信息化项目规划问题”
一.LJ集团是北京的一家规模巨大的房地产投资公司,早在15年前,该公司出现了如下几个问题:每个业务员手上的用户资料,其他人无法得知,从而导致员工离职时会流失大量潜在客户:业务员繁忙的时候,无法满足客户 ...
- 手把手部署n8n
n8n 是当前非常热门的开源 AI 工作流平台,在 GitHub 上已获得超过九万颗 star. 通过 n8n,用户可以拖拽节点,轻松搭建复杂的 AI 工作流.每个节点都支持上千种插件,可灵活集成各类 ...