文章插图
| 总结/Edison Zhou
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入门实战教程系列文章也就结束了,希望能够对你有所帮助 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- mongodb是nosql数据库吗 13 NoSQL | MongoDB入门实战教程
- 做双眼皮有几种方法
- 最有激情的健身运动是什么
- 终端净水,只为能饮用健康好水
- it翻译 IT是什么意思?
- 阿西吧是什么意思 阿西吧为什么在韩国是骂人话 韩语骂人的话中文读法
- 狗带是什么意思什么梗 狗带是go die的谐音
- 网络语拔草是什么意思?种草是什么意思 微博上长草种草拔草是什么梗 种草族心理
- 氪金是什么意思什么梗 氪金是大量充值的意思
- 集美们是什么意思什么梗 集美们的含义及出处