cari

Rumah  >  Soal Jawab  >  teks badan

mongodb 用户点赞功能怎么设计比较合理?

假设用户为文章点赞,点赞操作是可以取消的。

用户和文章应该是多对多的关系,我看了一下 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
}

由于没有实践经验,所以特地来请教一下。顺便问下还有没有其他更好的方式?

怪我咯怪我咯2796 hari yang lalu1062

membalas semua(2)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-04-24 09:13:52

    Penyelesaian ketiga dicadangkan di sini, iaitu untuk menyimpan pelbagai _id pengguna yang menyukai artikel dalam koleksi siaran, contohnya:

    // posts
    {
        _id: ObjectID('4e7020cb7cac81af7136236b'),
        users_like_this_post: [
            ObjectID('4e7020cb7cac81af71362361'),
            ObjectID('4e7020cb7cac81af71362362')
        ]
    }
    

    Semak pengguna yang menyukai artikel:

    post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
    console.log(post.users_like_this_post);
    

    Semak bilangan suka untuk artikel:

    post = db.posts.findOne({_id: ObjectID('4e7020cb7cac81af7136236b')});
    console.log(post.users_like_this_post.length);
    

    Semak artikel dengan 100 suka:

    posts = db.posts.find({'users_like_this_post.100': {$exists: true}});
    

    Semak artikel yang disukai oleh pengguna:

    posts = db.posts.find({users_like_this_post: user._id});
    

    pengguna menyukai siaran:

    db.posts.update({_id: post._id}, {$addToSet: {users_like_this_post: user._id}});
    

    pengguna tidak suka siaran:

    db.posts.update({_id: post._id}, {$pull: {users_like_this_post: user._id}});
    

    PS: Kod di atas belum diuji, sila rujuk dokumentasi untuk ujian.

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-24 09:13:52

    Pilihan terakhir disyorkan, kerana anda juga harus mengira bilangan suka untuk setiap artikel.

    balas
    0
  • Batalbalas