mongodb上使用两个集合减少API调用的模式
如果我有两个集合,一个用户集合和一个图片集合,我不太确定最佳实践是什么-我不想将所有图片嵌入到我的用户集合中mongodb上使用两个集合减少API调用的模式,mongodb,nested-queries,Mongodb,Nested Queries,如果我有两个集合,一个用户集合和一个图片集合,我不太确定最佳实践是什么-我不想将所有图片嵌入到我的用户集合中 我的客户在特定条件下搜索图片。假设他从搜索中得到50张图片(即一个mongodb查询)。每个图片都与一个用户关联。我希望用户名也显示出来。我假设没有办法对返回每张图片的每个用户名称的用户集合执行单一搜索性能,即我必须执行50次搜索。这意味着,我只能通过复制图片集合中的数据(在用户名旁边)来避免额外的性能负载 同样的问题反过来说。如果我的客户搜索用户,并且说通过一个查询从搜索中返回了50个
假设您有一个与每个
用户关联的用户
id
,并且您还将该id
存储在图片
文档中,那么您的用户
图片
是一个松散耦合的关系
为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些id
s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在id
s列表中,请将它还给我。”
如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式 假设您有一个
用户
id与每个用户
关联,并且您也将该id
存储在图片
文档中,那么您的用户
图片是一个松散耦合的关系
为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些id
s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在id
s列表中,请将它还给我。”
如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式 假设您有一个
用户
id与每个用户
关联,并且您也将该id
存储在图片
文档中,那么您的用户
图片是一个松散耦合的关系
为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些id
s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在id
s列表中,请将它还给我。”
如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式 假设您有一个
用户
id与每个用户
关联,并且您也将该id
存储在图片
文档中,那么您的用户
图片是一个松散耦合的关系
为了不必进行50个单独的调用,您可以使用给定的,您可以提取那些id
s并将它们放入列表中以运行第二个查询。您的查询基本上是英文的:“查看集合,如果它在id
s列表中,请将它还给我。”
如果您打算经常这样做,并希望它能够扩展,我建议您使用关系数据库或能够处理连接的NoSQL数据库,以避免强制您进入嵌入式文档模式 假设图片集合的模式如下所示: 图片文档
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342)
}
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342),
user_name:"user associated"
}
{
_id: Objectid(342),
name: "Steve jobs",
last_assoc_img: {
img_id: Object(342)
url: 'img_one',
title: 'last image title
}
}
1)您的图片查询将返回如上所示的文档。你不必打50个电话就能让用户与图像关联。您只需使用从图片文档中获取的用户ID对用户集合进行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)
}
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342),
user_name:"user associated"
}
{
_id: Objectid(342),
name: "Steve jobs",
last_assoc_img: {
img_id: Object(342)
url: 'img_one',
title: 'last image title
}
}
如果你这样设计的话。您只需要1呼叫,但用户名不会与用户收集文档同步。例如,假设用户更改了他们的名称。以前保存的图片可能具有旧用户名
2)您可以将用户收藏设计为:
用户文档
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342)
}
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342),
user_name:"user associated"
}
{
_id: Objectid(342),
name: "Steve jobs",
last_assoc_img: {
img_id: Object(342)
url: 'img_one',
title: 'last image title
}
}
您可以使用与上述相同的原则。假设图片集的模式如下:
图片文档
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342)
}
{
_id: Objectid(123),
url: 'img1.jpg',
title: 'img_one',
userId: Objectid(342),
user_name:"user associated"
}
{
_id: Objectid(342),
name: "Steve jobs",
last_assoc_img: {
img_id: Object(342)
url: 'img_one',
title: 'last image title
}
}
1)您的图片查询将返回如上所示的文档。你不必打50个电话就能让用户与图像关联。您只需使用从图片文档中获取的用户ID对用户集合进行1其他查询,如:
db.users.find({_id: {$in[userid_1,user_id2,userid_3,...,userid_n]}})
您将获得a