1

考虑这个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 决定将他的名字更新为“John Doe”,这意味着每次用户更新他们的名字时:

  1. 我必须更新users收集文件

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

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

提前致谢

4

1 回答 1

0

是的,这实际上是更新在不同集合中的文档之间共享的字段的唯一方法。

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

{
  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 提供了聚合框架来实现这一点。

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

  1. 如果您有大量帖子(例如 twitter 中的推文或 facebook 中的帖子),请考虑通过使用 cron 作业将更新分成几个较小的(与查询更新的文档数量有关)更新 [时间分隔] . 懒惰更新。
  2. 有时,如果引用的字段不会影响用户体验,则可能不需要更新。
于 2013-10-02T08:39:20.483 回答