Mongodb 多个集合的最佳做法
Mongodb best practices for multiple collections
在一个论坛类型的网站上,我有两个彼此密切相关的集合。 users
和 likes
.
likes: {
_id:5fa9ba086259f619f7d9f82b
postId:"7A0A"
author:"e3fc0911-b708-481e-b4fb-8c1c60a57c3d"
}
user: {
_id:"51c6cc3b-6951-45c5-bf07-cfe86fccbbd5"
username:"sun"
}
每次获取用户时,我都想显示该用户的总点赞数。到目前为止,我已经用投影解决了这个问题。我会得到作者。获取喜欢的数量并使用投影将其组合。
[{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: 'author',
as: 'likes'
}
}, {
$project: {
author: 1,
username: 1,
likeAmount: {
$size: '$likes'
},
}
}]
此 returns 具有特定用户的点赞数的用户对象。
在我开始添加更多功能之前,它一直运行良好。新功能是 posts。现在,对于每个 post,我想查询 post 的作者,并与作者一起查询喜欢的内容。每个功能都开始变得越来越复杂。
我担心很快我将达到嵌套引用的限制,我无法再与投影数据进行交互。
Idea1
:分解前端的 API 调用。所以 post 不会自动让用户使用它。前端必须先获取 post。然后根据userId查询用户。
Idea2
:在用户中保留一个运行 likeAmount 属性,它会随着给定用户的每一个like而增加。 (更多字段保持更新,重复数据)
在 mongodb 中处理此类结构的最佳方法是什么?
这个问题比较隐晦,但我相信您需要有关如何组织集合的建议。
- 反模式之一是将您通常一起查询的不同内容存储在一起。
如果你说“每次我想要一个用户我也想要喜欢的人”,那应该在同一个集合中。
- Atlas 和 Compass 向您展示反模式。
他们会在你查询数据库次数足够多后对你的查询进行分类,并告诉你是否有问题。
如果你确实需要查找+过滤,有一个巧妙的方法:
{
$graphLookup: {
from: <collection>,
startWith: <expression>,
connectFromField: <string>,
connectToField: <string>,
as: <string>,
maxDepth: 0,
restrictSearchWithMatch: <document>
}
}
您的查询在哪里,例如。 {abdominals:null}
。我故意设置 maxDepth:0 因为看起来你可以使用它,但 maxDepth 只是 <number>
请记住,对于快速应用程序来说,查找可能是不受欢迎的。
MongoDB 有一个 video on this topic.
在一个论坛类型的网站上,我有两个彼此密切相关的集合。 users
和 likes
.
likes: {
_id:5fa9ba086259f619f7d9f82b
postId:"7A0A"
author:"e3fc0911-b708-481e-b4fb-8c1c60a57c3d"
}
user: {
_id:"51c6cc3b-6951-45c5-bf07-cfe86fccbbd5"
username:"sun"
}
每次获取用户时,我都想显示该用户的总点赞数。到目前为止,我已经用投影解决了这个问题。我会得到作者。获取喜欢的数量并使用投影将其组合。
[{
$lookup: {
from: 'likes',
localField: '_id',
foreignField: 'author',
as: 'likes'
}
}, {
$project: {
author: 1,
username: 1,
likeAmount: {
$size: '$likes'
},
}
}]
此 returns 具有特定用户的点赞数的用户对象。
在我开始添加更多功能之前,它一直运行良好。新功能是 posts。现在,对于每个 post,我想查询 post 的作者,并与作者一起查询喜欢的内容。每个功能都开始变得越来越复杂。
我担心很快我将达到嵌套引用的限制,我无法再与投影数据进行交互。
Idea1
:分解前端的 API 调用。所以 post 不会自动让用户使用它。前端必须先获取 post。然后根据userId查询用户。
Idea2
:在用户中保留一个运行 likeAmount 属性,它会随着给定用户的每一个like而增加。 (更多字段保持更新,重复数据)
在 mongodb 中处理此类结构的最佳方法是什么?
这个问题比较隐晦,但我相信您需要有关如何组织集合的建议。
- 反模式之一是将您通常一起查询的不同内容存储在一起。
如果你说“每次我想要一个用户我也想要喜欢的人”,那应该在同一个集合中。
- Atlas 和 Compass 向您展示反模式。
他们会在你查询数据库次数足够多后对你的查询进行分类,并告诉你是否有问题。
如果你确实需要查找+过滤,有一个巧妙的方法:
{
$graphLookup: {
from: <collection>,
startWith: <expression>,
connectFromField: <string>,
connectToField: <string>,
as: <string>,
maxDepth: 0,
restrictSearchWithMatch: <document>
}
}
您的查询在哪里,例如。 {abdominals:null}
。我故意设置 maxDepth:0 因为看起来你可以使用它,但 maxDepth 只是 <number>
请记住,对于快速应用程序来说,查找可能是不受欢迎的。
MongoDB 有一个 video on this topic.