【问题标题】:Updating embedded object that referenced to another collection in MongoDB更新引用 MongoDB 中另一个集合的嵌入对象
【发布时间】:2013-10-02 02:10:06
【问题描述】:

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. 我必须在 posts 集合中找到用户与更新后的用户 ID 相同的所有文档,并更新名称

这被认为是一种好的做法吗? 还有其他更好的方法吗?

提前致谢

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    另一种解决方案是考虑更改数据的建模方式。您可以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. 如果您有大量帖子(例如 twitter 中的推文或 facebook 中的帖子),请考虑将更新分成几个较小的(与查询更新的文档数量有关)更新 [时间分隔],方法是使用的 cron 作业。延迟更新。
    2. 有时,如果引用的字段不会影响用户体验,则可能不需要更新。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多