设为首页 收藏本站
查看: 1253|回复: 0

[经验分享] 写给MongoDB开发者的50条建议Tip10

[复制链接]

尚未签到

发表于 2018-10-28 07:23:17 | 显示全部楼层 |阅读模式
  本系列文章翻译自《50 Tips and Tricks for MongoDB    Developers》,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下。一方面加强自己学习的效果,另一方面让大   家也一起来体验一下需要我们这些mongodb使用者需要注意的地方。
  首先声明自己的英文水平不是太高,加之有些英文翻译成中文也找不到合适的词来表达,所以在文章中可能会出现英文原词,或者说有些地方的翻译会有些生     硬,也就是说会出现直译的地方。翻译该书的主要目的是为大家学习探讨用的,如果有翻译不精准的地方,或者说有更加精准的翻译,还请大家指出,我会及时的更   正的,在此先谢过各位了。
  Tip10.Design documents to be self-sufficient
  

  将文档设计成自给自足的
  mongodb应该是一个大的,无声的数据存储容器。它本身不做任何处理,只是负责存储和读取数据。你应该坚持这个目的,避免强迫mongodb进行一些客户端可以进行的计算工作。甚至是一些例如计算平均数或者是计算加和这样琐碎的工作,都应该推给客户端去做。
  如果你非要进行一些需要计算的查询,你有两个选择:


  • 招来严重的性能惩罚。在mongodb中使用javascript进行计算。
  • 在文档中显式的存储这些信息。
  通常来说,你应该在文档中显式的存储这些信息。
  假设你需要查询apple和orange总共是30个的文档。
  


  • {
  •   "_id":123,
  •   "apple":10,
  •   "orange":12
  • }
  

  如果文档是上面的格式,就需要在查询的同时使用javascript进行计算工作,非常低效。相反,在文档中加一个total的字段。
  


  • {
  •   "_id":123,
  •   "apple":12,
  •   "orange":14,
  •   "total":30
  • }
  

  在更新apple和orange数量的时候,同时更新一下total的信息。
  


  • >db.food.update({"_id":123},{"$inc":{"apple":10,"orange":-2,"total":8}})
  • >db.food.findOne()
  • {
  •   "_id":123,
  •   "apple":22,
  •   "orange":12,
  •   "orange":38
  • }
  

  假设是下面的情形,你的total存储的是水果的类型数量。
  


  • {
  •   "_id":123,
  •   "apple":10.
  •   "orange":24,
  •   "total":2
  • }
  

  现在,你需要更新文档,但是有可能增加字段,也有可能不增加字段。那你是否增加total的值呢?如果更新语句是下面的情况,你就需要更新total的值。
  


  • >db.food.update({"_id":123},{"$inc":{"banana":12,"total":1}})
  

  相反的,如果banana字段已经存在了呢,我们就不应该增加total字段的值。但是在客户端,我们不知道这些情况。
  通常在这种情况下,我们有两种处理方法:速度快,会产生不一致;速度慢,没有不一致。
  快速的办法就是不管三七二十一,给total加1,同时让应用意识到将来还需要检查total的值是否正确。可以运行一个不间断的批量处理任务,修正这些数据。
  如果应用可以接受额外的处理时间,我们可以使用findAndModify方法,将文档lock(设置一个locked字段,其他的写请求会检查这个字段),返回文档,然后在正确更新total的值之后,将lock字段设置为false。
  


  • >var resule=db.runCommand({"findAndModify":"food",
  •   "query":{"_id":123,"locked":false},
  •   "update":{"$set":{"locked":true}}})
  • >if ("banana" in result.value){
  •   db.food.update({criteria,{"$set":{"locked":false}."$inc":{"banana":20}}})
  •   }else{
  •   db.food.update({criteria,{"$set":{"locked":false},"$inc":{"banana":3,"total":1}}})
  • }
  

  具体如何选择,依赖于你的应用需求。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627278-1-1.html 上篇帖子: MongoDB工作应用(1) 下篇帖子: PHP中使用MongoDB开发实践体会
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表