我正在尝试创建一个功能,以便用户可以喜欢帖子(用户喜欢的帖子或用户不喜欢的帖子,即不喜欢或投票)。
我的帖子是带有架构的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?
答案 0 :(得分:3)
MongoDB中的文档限制是16mb,这是非常巨大的。除非您尝试创建下一个Facebook,否则将ID放入阵列中将不成问题。我在单个文档数组中有10k + ID的生产工作流程,没有问题。问题不应该与文档大小有关,您必须根据您需要的查询选择放置文档的位置。
我会为Post创建一个架构并将喜欢的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');
希望它对你有所帮助。