2013-10-02 57 views
1

考虑这款型号为posts集合:在MongoDB的另一个集合引用更新嵌入对象

{ 
    id: 123, 
    title: "Hello World", 
    user: { 
    id: 999, 
    name: "John" 
    }, 
    body: "Lorem ipsum" 
} 

那么我users集合:

{ 
    id: 999, 
    name: "John", 
    email: "[email protected]", 
    group: { 
    id: 888, 
    name: "admin" 
    } 
} 

比方说,有一天,约翰决定更新自己的命名为“李四”, 现在意味着每个用户更新他们的名字时间:

  1. 我必须在users收集

  2. 更新文档我必须找到posts收集用户等于已更新的用户ID的所有文件,并更新名称

这被认为是一个良好的做法? 有没有另外一个更好的方法来做到这一点?

在此先感谢

回答

0

是的,这实际上是更新了在不同的收藏文件之间共享一个领域的唯一途径。

另一种解决方案是考虑改变数据的建模方式。您可以在用户集合中将embed与他自己文档中每个用户相关的帖子文档。如下所示:

{ 
    id: 999, 
    name: "John", 
    email: "[email protected]", 
    group: { 
    id: 888, 
    name: "admin" 
    } 
    posts: [ 
    { 
     id: 123, 
     title: "Hello World", 
     body: "Lorem ipsum" 
    }, 
    { 
     id: 235, 
     title: "Hello World 2", 
     body: "Lorem ipsum 2" 
    } 
    ] 
} 

现在,每个用户都有嵌入到自己文档中的帖子列表。当你更新用户的名字时,你不需要在其他文档中再次更新它。但是,这种数据模型可能不适合您的应用程序的需求。
例如,您可能希望有一个观点,即显示根据一个特定的标准不同用户的帖子[发布日期,人气,...],在这种情况下,这将是更难查询职位为所有用户文档符合你的标准。 MongoDB提供了Aggregation Framwork使这成为可能。

有关更新的一些一般提示:

  1. 如果你有职位(比如在Facebook的Twitter或职位的tweets)的数量庞大,考虑将更新成几个较小(与数由查询更新的文档)通过使用cron作业更新[时间分隔]。懒惰更新。
  2. 有时,如果参考字段不会影响用户体验,则可能不需要更新引用字段。
相关问题