我正在尝试制作一个功能,以便用户可以喜欢帖子(用户喜欢或不喜欢帖子,即没有不喜欢或投票)。
我的帖子是具有模式的 MongoDB 集合中的对象
{
title: String,
text: String
}
当我的用户有架构时
{
username: String,
password: String
}
例如,我可以在帖子中创建一个数组,其中包含喜欢特定帖子的用户的 ID。它看起来像
{
title: String,
text: String,
likedByUsers: [ObjectID]
}
或者我可以在用户处创建一个数组,其中包含用户喜欢的帖子的 ID,类似于
{
username: String,
password: String,
postsLiked: [ObjectID]
}
但是,我预计用户会喜欢成千上万的帖子,因此我可能会面临 MongoDB 中对象大小的限制。
所以我在想我应该创建一个新的收藏集
{
userId: ObjectID,
postId: ObjectID
}
但是,我正在考虑如何在我的应用中检索它。
我是否应该存储用户(已登录)喜欢的所有帖子的 ID 数组,并且当我打印每个帖子时,我将查看该帖子是否在用户喜欢的帖子中, 然后显示一个“已经喜欢”按钮?
或者,我可以在请求查看所有帖子时发送用户 ID,然后为每个帖子添加一个字段,表示“isLiked”,表示是否可以找到 Liked 集合中的对象,同时匹配帖子和用户 ID?
最佳答案
MongoDB 中文档的限制是 16mb,这是相当大的。除非您试图创建下一个 Facebook,否则将 ID 放入数组中不会成为问题。我在单个文档数组中有 10k+ ID 的生产工作流,没有问题。问题不应该与文档大小有关,您必须根据需要的查询选择将其放置在何处。
我会为帖子创建一个模式并将喜欢的 ID 放在那里,例如:
{
title: { type: String },
text: { type: String },
likes: [{ type: ObjectId, ref: 'users' }]
}
帖子会变老,人们会不再喜欢它,所以如果放在 Post 而不是 User 集合中,数组的平均大小应该更小。此外,放置 ref
属性使您能够使用 Mongoose Populate API,因此您可以查询以下帖子:
Posts.find().populate('likes');
这将为您提供数组中的完整用户信息。要搜索单个用户喜欢的帖子,也非常简单:
Posts.find({likes: userId}).populate('likes');
希望对你有帮助。
关于javascript - 我如何使用 Mongoose 确定用户是否喜欢帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041511/