在论坛类型的网站上,我有两个彼此密切相关的集合。 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'
},
}
}]
这将返回带有特定用户点赞次数的用户对象。
在我开始添加更多功能之前,它一直运行良好。新功能是帖子。现在,对于每个帖子,我想查询该帖子的作者,并向作者查询喜欢的帖子。每个功能都变得越来越复杂。
我担心很快就会遇到无法与投影数据交互的嵌套引用的限制。
Idea1
:分解前端的API调用。因此,发布不会自动吸引用户。前端必须先获取帖子。然后根据userId询问用户。
Idea2
:在User中保持运行的likeAmount属性,对于给定的用户,每次赞都会增加。 (更多字段可保持更新,重复数据)
在mongodb中处理此类结构的最佳方法是什么?
答案 0 :(得分:1)
这个问题相当神秘,但是我相信您想要有关如何组织馆藏的建议。
如果您说“每次我想要一个用户,我也想要一个”,那应该在同一个集合中。
在您查询数据库足够的时间之后,它们会对您的查询进行分类,并告诉您是否有问题。
如果您确实需要查找+过滤器,可以使用以下一种整齐的方法:
{
$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。