当前位置:  开发笔记 > 编程语言 > 正文

mongodb最佳实践:筑巢

如何解决《mongodb最佳实践:筑巢》经验,为你挑选了3个好方法。

嵌套这个例子通常被认为是好的还是坏的做法(以及为什么)?

一个名为users的集合:

user
    basic
        name : value
        url : value
    contact
        email
            primary : value
            secondary : value
        address
            en-gb
                address : value
                city : value
                state : value
                postalcode : value
                country : value
            es
                address : value
                city : value
                state : value
                postalcode : value
                country : value

编辑:从这篇文章的答案我已经更新了应用以下规则的模式(数据与上面略有不同):

巢,但只有一层深

删除不必要的密钥

利用数组使对象更加灵活

{
   "_id": ObjectId("4d67965255541fa164000001"),
   "name": {
     "0": {
       "name": "Joe Bloggs",
       "il8n": "en" 
      } 
    },
   "type": "musician",
   "url": {
     "0": {
       "name": "joebloggs",
       "il8n": "en" 
      } 
    },
   "tags": {
     "0": {
       "name": "guitar",
       "points": 3,
       "il8n": "en" 
      } 
    },
   "email": {
     "0": {
       "address": "joe.bloggs@example.com",
       "name": "default",
       "primary": 1,
       "il8n": "en" 
      } 
    },
   "updates": {
     "0": {
       "type": "news",
       "il8n": "en" 
      } 
    },
   "address": {
     "0": {
       "address": "1 Some street",
       "city": "Somecity",
       "state": "Somestate",
       "postalcode": "SOM STR",
       "country": "UK",
       "lat": 49.4257641,
       "lng": -0.0698241,
       "primary": 1,
       "il8n": "en" 
      } 
    },
   "phone": {
     "0": {
       "number": "+44 (0)123 4567 890",
       "name": "Home",
       "primary": 1,
       "il8n": "en" 
      },
     "1": {
       "number": "+44 (0)098 7654 321",
       "name": "Mobile",
       "il8n": "en" 
      } 
    } 
}

谢谢!



1> Andrew Orsic..:

在我看来,上面的模式不是"普遍接受",但看起来很棒.但我建议一些改进,以帮助您将来查询您的文档:

User
    Name 
    Url
    Emails {email, emailType(primary, secondary)}
    Addresses{address, city, state, postalcode, country, language}

嵌套总是很好,但是两层或三层嵌套可能会在查询/更新时产生额外的麻烦.

希望我的建议能帮助您正确选择架构设计.



2> Pero P...:

您可能希望了解MongoDB 中的模式设计,特别是有关嵌入与引用的建议.

嵌入是首选,因为"然后将数据放在磁盘上;消除了对数据库的客户端 - 服务器周转".如果父对象在RAM中,则对嵌套对象的访问将始终很快.



3> brianz..:

根据我的经验,我从来没有找到任何MongoDB记录实际看起来的"最佳实践".真正回答的问题是,"这个MongoDB模式是否允许我做我需要做的事情?"

例如,如果你有一个地址列表并需要更新其中一个地址,那就太麻烦了,因为你需要遍历所有地址或知道特定地址所在的位置.你是安全的,因为每个地址都有一个键值.

但是,我会说nix basiccontact键.这些真正给你带来了什么?如果你索引name,那就basic.name不仅仅是name.AFAIK,对长键和短键名称有一些性能影响.

保持简单,足以做你需要做的事情.尝试一下并迭代它......你不会在第一次就把它弄好,但关于mongo的好处是,你可以相对容易地重新设计你的模式.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有