Maison > Questions et réponses > le corps du texte
假设用户为文章点赞,点赞操作是可以取消的。
用户和文章应该是多对多的关系,我看了一下 mongodb 官网上面的 一对多的实例,像它这样在 多 的一方添加 一 的 id,应该是比较适合那种建立了就不会轻易发生改变的关系。但像点赞这种经常发生改变的操作似乎就不太适用这种形式了。
后来我想了两个方案。
第一种是在 用户文档 中添加一个 like
的数组,每点赞一次就给把 文章id push 到 like
里面,每次删除就直接删除数组里面的 文章id 。
// User
{
username: 'test',
like: [123, 234, 345, 456, 567, 678, 789,890] // 文章id
}
第二种就是用传统的 RDB 的方法,新建一个 Like
的 collection,里面存的是 用户id 和 文章id 。
// Like
{
user_id: 111,
post_id: 123
}
由于没有实践经验,所以特地来请教一下。顺便问下还有没有其他更好的方式?
伊谢尔伦2017-04-24 09:13:52
Une troisième solution est proposée ici, qui consiste à stocker un tableau des _ids des utilisateurs ayant aimé l'article dans la collection de posts, par exemple :
// posts
{
_id: ObjectID('4e7020cb7cac81af7136236b'),
users_like_this_post: [
ObjectID('4e7020cb7cac81af71362361'),
ObjectID('4e7020cb7cac81af71362362')
]
}
Vérifiez les utilisateurs qui ont aimé un article :
post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
console.log(post.users_like_this_post);
Vérifiez le nombre de likes pour un article :
post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
console.log(post.users_like_this_post.length);
Consultez les articles avec 100 likes :
posts = db.posts.find({'users_like_this_post.100': {$exists: true}});
Vérifiez les articles aimés par l'utilisateur :
posts = db.posts.find({users_like_this_post: user._id});
l'utilisateur a aimé le message :
db.posts.update({_id: post._id}, {$addToSet: {users_like_this_post: user._id}});
l'utilisateur n'aime pas la publication :
db.posts.update({_id: post._id}, {$pull: {users_like_this_post: user._id}});
PS : Le code ci-dessus n'a pas été testé, veuillez vous référer à la documentation pour les tests.
伊谢尔伦2017-04-24 09:13:52
Cette dernière option est recommandée, car vous devez également compter le nombre de likes pour chaque article.