mongodb 上用于减少 API 两次调用的架构 collections
Schema on mongodb for reducing API calls with two collections
如果我有两个 collection,一个用户 collection 和一张图片 collection,我不太确定最佳做法是什么 - 我不想将所有图片嵌入到我的用户 collection。
我的客户端根据特定条件搜索图片。假设他从搜索中返回了 50 张图片(即一个 mongodb 查询)。每张图片都与一个用户相关联。我也想显示用户名。我假设没有办法在用户 collection return 上对每张图片的每个用户的名称进行明智的搜索,即我将不得不进行 50 次搜索。这意味着,我只能通过在我的图片 collection?
[=22= 中复制数据(在 user_id 旁边,还有 user_name 旁边)来避免这种额外的性能负载]
反过来问同样的问题。如果我的客户搜索用户并说 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 id
s, 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
}
}
您可以使用与上述相同的原则。
如果我有两个 collection,一个用户 collection 和一张图片 collection,我不太确定最佳做法是什么 - 我不想将所有图片嵌入到我的用户 collection。
我的客户端根据特定条件搜索图片。假设他从搜索中返回了 50 张图片(即一个 mongodb 查询)。每张图片都与一个用户相关联。我也想显示用户名。我假设没有办法在用户 collection return 上对每张图片的每个用户的名称进行明智的搜索,即我将不得不进行 50 次搜索。这意味着,我只能通过在我的图片 collection?
[=22= 中复制数据(在 user_id 旁边,还有 user_name 旁边)来避免这种额外的性能负载]反过来问同样的问题。如果我的客户搜索用户并说 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 id
s, 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
}
}
您可以使用与上述相同的原则。