写给MongoDB开发者的50条建议Tip9

本系列文章翻译自《50 Tips and Tricks for MongoDB Developers》,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下。一方面加强自己学习的效果,另一方面让大 家也一起来体验一下需要我们这些mongodb使用者需要注意的地方。

首先声明自己的英文水平不是太高,加之有些英文翻译成中文也找不到合适的词来表达,所以在文章中可能会出现英文原词,或者说有些地方的翻译会有些生 硬,也就是说会出现直译的地方。翻译该书的主要目的是为大家学习探讨用的,如果有翻译不精准的地方,或者说有更加精准的翻译,还请大家指出,我会及时的更 正的,在此先谢过各位了。

Tip9.Store embedded information in arrays for anonymous access

将通用化的信息使用嵌入式结构存储在数组中

有一个问题,经常会出现。

“在数组中嵌入信息呢?还是用子文档表示呢?”

当你精确的知道你要查询的内容的时候,适合使用子文档。如果你对于要查询的内容知道的不很精确,适合使用数组。当你知道你要查询的数据的一些规则的时候,适合使用数组。

假设我们正在开发一个游戏程序,游戏角色可以装备各种武器,我们定义下面的文档。

 


  1.   "_id":"fred"
  2.   "items":{ 
  3.     "slingshot":{ 
  4.       "type":"weapon"
  5.       "damage":23
  6.       "ranged":true 
  7.     }, 
  8.     "jar":{ 
  9.       "type":"container"
  10.       "contains":"fairy" 
  11.     }, 
  12.     "sword":{ 
  13.       "type":"weapon"
  14.       "damage":30
  15.       "ranged":false 
  16.     } 
  17.   } 

 

现在,让我们找出所有武器中,能造成20以上伤害的武器。我们发现做不到!子文档的形式不允许我们进入items,告诉它返回伤害值大于等于20的武器。我们只能一个子文档一个子文档的查找,slingshot的伤害是否大于等于20,sword的伤害是否大于等于20。

如果你想要不使用标识就可以直接访问items,你就应该把他们存放在一个数组中。

 


  1.   "_id":"fred"
  2.   "items":[
  3.     { "id":"slingshot",
  4.       "type":"weapon"
  5.       "damage":23
  6.       "ranged":true 
  7.     }, 
  8.     { "id":"jar",
  9.       "type":"container"
  10.       "contains":"fairy" 
  11.     }, 
  12.     { "id":"sword",
  13.       "type":"weapon"
  14.       "damage":30
  15.       "ranged":false 
  16.     }
  17.   ]

 

现在你可以使用查询

 


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

来获取伤害大于等于20的武器了,如果你需要匹配特定项的话,可以使用$elemMatch来匹配。

那么,什么时候又需要用子文档替代数组呢?当你知道你访问的文档的字段的名称的时候。

例如,你跟踪一个游戏角儿的能力值,力量,智力,智慧,敏捷,体质和魅力的时候。你肯定想要知道一项具体的能力信息。我们就按照下面的方式存储。

 


  1.   "id":"fred", 
  2.   "race":"gnome", 
  3.   "class":"illusionlist", 
  4.   "abilities":{ 
  5.     "str":20, 
  6.     "int":30, 
  7.     "wis":50, 
  8.     "dex":24, 
  9.     "con":36, 
  10.     "cha":22 
  11.   } 

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




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/797087,如需转载请自行联系原作者

上一篇:读书笔记2014第4本:程序员修炼之道-从小工到专家(第四章)


下一篇:写给MongoDB开发者的50条建议Tip10