Google cloud firestore Firestore子集合'=';查询

Google cloud firestore Firestore子集合'=';查询,google-cloud-firestore,Google Cloud Firestore,我知道Firestore不支持“!=”询问,但我想知道是否有人遇到过如下类似情况: 以下是我的数据库结构: Posts -> postId -> postDocument -> likedBy -> uid 我想做的只是在“likedBy”子集合中显示没有当前用户uid的帖子。这本身是不可能的,但我正在努力找到一份半体面的工作 目前,我得到了所有的帖子,并在本地进行检查,以显示正确的帖子。这可能与神奇的云功能有关吗?通过维护用户的提要,然后仅在运行时调用,您可能会发现成

我知道Firestore不支持“!=”询问,但我想知道是否有人遇到过如下类似情况:

以下是我的数据库结构:

Posts -> postId -> postDocument -> likedBy -> uid
我想做的只是在“likedBy”子集合中显示没有当前用户uid的帖子。这本身是不可能的,但我正在努力找到一份半体面的工作


目前,我得到了所有的帖子,并在本地进行检查,以显示正确的帖子。这可能与神奇的云功能有关吗?

通过维护用户的提要,然后仅在运行时调用,您可能会发现成功和用例超出了这一功能。我利用这种方法,发现我有很多自由度,云函数让我决定显示哪些类型的帖子,以及在哪些更改下,新帖子添加到用户的提要中

我这样做的方式是通过onCreate cloud函数查找新帖子,然后查找应该看到该帖子的人,等等,然后将其添加到他们的每个提要中

在你的情况下,我可以看到它被用来寻找新的喜欢上一篇文章。对于新的喜欢,它可以从用户的提要中删除帖子

一个函数的示例(为简洁起见进行了编辑),我使用该函数向用户的关注者提要添加帖子。通过使用collectionGroup查询抓取,我可以查询跟随文章作者的所有用户的列表

架构如下所示:

Users (collection)
--- User1 (document)
------- Following (collection of people User1 is following)
----------- FollowingUser1 (document, contains a uid of "followed" user)
----------- FollowingUser2
以及云功能:

exports.newReview =  functions.firestore
  .document('reviews/{reviewId}')
  .onCreate((snap, context) => {
      var reviewId = context.params.reviewId
      var reviewData = snap.data()
      var userFollowers = db.collectionGroup('following').where('uid', '==', userId)
      var followingTransaction = db.runTransaction(transaction => {
        return transaction.get(userFollowers).then(restDocs => {
          reviewData['added_via'] = 'following'
          restDocs.forEach(doc => {
            var followerId = doc.ref.parent.parent.id
            var followerRef = db.collection(`feeds/${followerId}/posts`).doc(reviewId)
            transaction.set(followerRef, reviewData);
          })
            return true
        }); 
      });

     return followingTransaction.then(values => {
          console.log(reviewData)
            var shouldPostToTwitter = reviewData.postToTwitter
            return Promise.resolve()
          }) .catch(error => {
            console.log(error)
            return Promise.reject(new Error("Error deleting"));
          });
  });
DB look,看看这个:

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL
});

const db = admin.firestore()

明白了,我有一个类似的功能来构建一个“朋友提要”。我对此感到挣扎的地方是,看看它将如何与10万左右的用户协同工作。如果我的理解是正确的,那么每当一篇文章被添加到用户的提要时,这将是一次额外的写入。是吗?是的,没错。我的看法与你在文章中添加的类似,它是在客户端运行逻辑之前获取大量文章的一种替代方法。是的,这是有道理的,我想这是两个缺点中较小的一个。谢谢:)我刚刚用我在prod中使用的代码更新了我的答案。我删除了很多代码,但这应该是您描述的更一般的情况。Dan非常感谢您的分享。我想这会让我到达我需要的地方。我真的很感谢你的帮助!