假設使用者為文章按讚,按讚操作是可以取消的。
用戶和文章應該是多對多的關係,我看了一下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
在此提出第三種方案,在 posts(文章) 集合中儲存對該文章點讚的用戶的 _id 的數組,例如:
// posts
{
_id: ObjectID('4e7020cb7cac81af7136236b'),
users_like_this_post: [
ObjectID('4e7020cb7cac81af71362361'),
ObjectID('4e7020cb7cac81af71362362')
]
}
查對一個文章按讚的使用者:
post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
console.log(post.users_like_this_post);
查一個文章的按讚數:
post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
console.log(post.users_like_this_post.length);
查按讚過 100 的文章:
posts = db.posts.find({'users_like_this_post.100': {$exists: true}});
查 user 讚過的文章:
posts = db.posts.find({users_like_this_post: user._id});
user 對 post 讚:
db.posts.update({_id: post._id}, {$addToSet: {users_like_this_post: user._id}});
user 對 post 取消按讚:
db.posts.update({_id: post._id}, {$pull: {users_like_this_post: user._id}});
PS: 以上程式碼未經測試,請自行參考文件進行測試。