mongodb 用戶按讚功能怎麼設計比較合理?
怪我咯
怪我咯 2017-04-24 09:11:52
0
2
921

假設使用者為文章按讚,按讚操作是可以取消的。

用戶和文章應該是多對多的關係,我看了一下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
}

由於沒有實務經驗,所以特地來請教一下。順便問下還有沒有其他更好的方式?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(2)
伊谢尔伦

在此提出第三种方案,在 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: 以上代码未经测试,请自行参考文档进行测试。

伊谢尔伦

建议后一种,因为,你应该还要统计每一个文章的点赞数量吧。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!