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

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

[复制链接]

尚未签到

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

  将通用化的信息使用嵌入式结构存储在数组中
  有一个问题,经常会出现。
  “在数组中嵌入信息呢?还是用子文档表示呢?”
  当你精确的知道你要查询的内容的时候,适合使用子文档。如果你对于要查询的内容知道的不很精确,适合使用数组。当你知道你要查询的数据的一些规则的时候,适合使用数组。
  假设我们正在开发一个游戏程序,游戏角色可以装备各种武器,我们定义下面的文档。
  


  • {
  •   "_id":"fred",
  •   "items":{
  •     "slingshot":{
  •       "type":"weapon",
  •       "damage":23,
  •       "ranged":true
  •     },
  •     "jar":{
  •       "type":"container",
  •       "contains":"fairy"
  •     },
  •     "sword":{
  •       "type":"weapon",
  •       "damage":30,
  •       "ranged":false
  •     }
  •   }
  • }
  

  现在,让我们找出所有武器中,能造成20以上伤害的武器。我们发现做不到!子文档的形式不允许我们进入items,告诉它返回伤害值大于等于20的武器。我们只能一个子文档一个子文档的查找,slingshot的伤害是否大于等于20,sword的伤害是否大于等于20。
  如果你想要不使用标识就可以直接访问items,你就应该把他们存放在一个数组中。
  


  • {
  •   "_id":"fred",
  •   "items":[
  •     { "id":"slingshot",
  •       "type":"weapon",
  •       "damage":23,
  •       "ranged":true
  •     },
  •     { "id":"jar",
  •       "type":"container",
  •       "contains":"fairy"
  •     },
  •     { "id":"sword",
  •       "type":"weapon",
  •       "damage":30,
  •       "ranged":false
  •     }
  •   ]
  • }
  

  现在你可以使用查询
  


  • {"items.damage":{"$gt":20}}
  

  来获取伤害大于等于20的武器了,如果你需要匹配特定项的话,可以使用$elemMatch来匹配。
  那么,什么时候又需要用子文档替代数组呢?当你知道你访问的文档的字段的名称的时候。
  例如,你跟踪一个游戏角儿的能力值,力量,智力,智慧,敏捷,体质和魅力的时候。你肯定想要知道一项具体的能力信息。我们就按照下面的方式存储。
  


  • {
  •   "id":"fred",
  •   "race":"gnome",
  •   "class":"illusionlist",
  •   "abilities":{
  •     "str":20,
  •     "int":30,
  •     "wis":50,
  •     "dex":24,
  •     "con":36,
  •     "cha":22
  •   }
  • }
  

  当你需要知道一项特殊技能的值的时候,你就可以查询abilities.str,或者是abilities.wis就可以了。我们不会有“能力值大于20的能力”这样的需求出现,我们总是知道我们要找的是什么。



运维网声明 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-627308-1-1.html 上篇帖子: 八天学会MongoDB:第四天 索引操作 下篇帖子: 运维生存时间生存在运维时代的我们,奋斗吧,众亲!数据库 mongodb
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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