mongodb 上用于减少 API 两次调用的架构 collections

Schema on mongodb for reducing API calls with two collections

如果我有两个 collection,一个用户 collection 和一张图片 collection,我不太确定最佳做法是什么 - 我不想将所有图片嵌入到我的用户 collection。

  1. 我的客户端根据特定条件搜索图片。假设他从搜索中返回了 50 张图片(即一个 mongodb 查询)。每张图片都与一个用户相关联。我也想显示用户名。我假设没有办法在用户 collection return 上对每张图片的每个用户的名称进行明智的搜索,即我将不得不进行 50 次搜索。这意味着,我只能通过在我的图片 collection?

    [=22= 中复制数据(在 user_id 旁边,还有 user_name 旁边)来避免这种额外的性能负载]
  2. 反过来问同样的问题。如果我的客户搜索用户并说 50 个用户通过一个查询从搜索中 returned。如果我希望最后一张关联图片 + 标题也显示在用户数据旁边,我将不得不再次将其添加到用户 collection,否则我假设我需要对 return 图片进行 50 次查询数据?

假设您有一个 user id 与每个 user 相关联并且您还将 id 存储在 picture 文档中,然后您的 user <=> picture 是松耦合关系。

为了不必进行 50 次单独的调用,您可以使用 $in operator,因为您可以提取那些 id 并将它们放入列表中 运行 第二个查询。您的查询基本上是英文的:"Look at the collection, if it's in the list of ids, give it back to me."

如果您打算经常这样做并打算对其进行扩展,我建议您使用可以处理连接的关系数据库或 NoSQL 数据库,而不是强迫您进入嵌入式文档模式。

假设您的图片集的架构是这样的:

图片文档

{
    _id: Objectid(123),
    url: 'img1.jpg',
    title: 'img_one',
    userId: Objectid(342)
}

1) 您的图片查询将 return 与上述类似的文档。您无需进行 50 次调用即可将用户与图像相关联。您可以简单地使用从图片文档中获取的用户 ID 对 Users Collection 进行 1 其他查询,例如:

db.users.find({_id: {$in[userid_1,user_id2,userid_3,...,userid_n]}})

您将收到一系列包含用户信息的用户文档。之后您必须处理它们在客户端上的显示。您最多需要 2 次调用。

或者

您可以这样设计架构:

图片文档

{
    _id: Objectid(123),
    url: 'img1.jpg',
    title: 'img_one',
    userId: Objectid(342),
    user_name:"user associated"
}

如果你这样设计。您只需要 1 调用,但用户名不会与用户集合文档同步。 例如,假设用户更改了他们的名字.以前保存的图片可能是旧用户名。

2) 您可以这样设计您的用户集合:

用户文档

{
    _id: Objectid(342),
    name: "Steve jobs",
    last_assoc_img: {
           img_id: Object(342)
           url: 'img_one',
           title: 'last image title
    }
}

您可以使用与上述相同的原则。