获取用户在单个查询中喜欢提要的信息 (Firestore)

Ahm*_*man 5 database firebase google-cloud-firestore

我想为我的用户显示提要。
每个帖子都有一个“喜欢”按钮(比如在 twitter、Instagram 中……)
如果帖子已经被喜欢或不被喜欢,我想显示一个不同的图标。

我现在面临的问题是,如果用户已经喜欢该帖子,我就找不到一种经济的方式来获取信息。最好的方法是,如果我可以通过单个查询获得这些信息。我有两种方法,我认为这还不是最好的方法。

  1. 查询用户“喜欢”的集合,每次他加载一个提要
    这将花费 2 个查询每个加载的帖子,这在性能和计费方面可能会很昂贵。例如,观看 20 个帖子将花费 40 次查询。

  2. 一次性下载所有喜欢的帖子并离线查询
    我可以检查给定的帖子是否已经以客户端的方式被用户喜欢。但这会由“喜欢”给帖子点赞的用户一次加载许多不必要的数据。

我的想法正确吗?有没有更好的方法来解决这个问题,同时又不会因为计费和性能而变得过于昂贵?

hud*_*son 0

您可以在每个帖子中创建一个数组,其中包含喜欢该帖子的用户的用户 ID。

// data model

posts/{postID}
  -- content (string)
  -- likes: [
       user123,
       user567,
       user895,
  ]

Run Code Online (Sandbox Code Playgroud)

然后像这样查询帖子。

db.collection('posts')
  .orderBy('createdAt', 'desc')
  .limit(50)
Run Code Online (Sandbox Code Playgroud)

然后在快照里面。

db.collection('posts')
  .orderBy('createdAt', 'desc')
  .limit(50).get()
  .then(snapshot => {
    if (snapshot.empty) {
      console.log('No matching documents.');
      return;
    }  

    snapshot.forEach(doc => {
      console.log(doc.id, '=>', doc.data());

      var liked = false;
      var likes = doc.data().likes;

      if (likes.includes(user_uid){
         liked = true
      }

      return createPost(doc.data(), liked);


    });
  })
  .catch(err => {
    console.log('Error getting documents', err);
  });
Run Code Online (Sandbox Code Playgroud)

然后下面创建一个名为“createPost()接受参数dataand ”的函数likedStatus

添加{likedStatus ? "You liked this" : "Like post"}到您的createPost函数中。

createPost = (data, likedStatus) => {

  return (
    <div class="content">
       <div class="liked">
           {likedStatus ? "You liked this" : "Like post"}
       </div>
    </div>  

  )

}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的答复。该解决方案将受到文档大小的限制。此外,客户端会下载大量不必要的数据。我对吗 ? (3认同)