更新引用MongoDB中另一个集合的嵌入对象

时间:2013-10-02 02:10:07

标签: mongodb

考虑posts集合的此模型:

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

然后我有users集合:

{
  id: 999,
  name: "John",
  email: "john@john.com",
  group: {
    id: 888,
    name: "admin"
  }
}

让我们说有一天,约翰决定将他的名字改为“John Doe”, 现在,这意味着每次用户更新其名称时:

  1. 我必须更新users集合

  2. 上的文档
  3. 我必须在posts集合中找到用户与更新用户ID相同的所有文档,并更新名称

  4. 这被认为是一种好习惯吗? 还有另一种更好的方法吗?

    提前致谢

1 个答案:

答案 0 :(得分:0)

是的,这实际上是更新不同馆藏中文件之间共享的字段的唯一方法。

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

{
  id: 999,
  name: "John",
  email: "john@john.com",
  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中的帖子),请考虑将更新分为几个较小的(与查询更新的文档数相关)更新[时间分隔],方法是使用的cron工作。懒惰更新。
  2. 有时,如果引用的字段不会影响用户体验,则可能不需要更新。