Firestore子集合“!=”查询

时间:2019-09-26 15:51:17

标签: google-cloud-firestore

我知道Firestore不支持'!='查询,但是我想知道是否有人遇到过以下类似情况:

这是我的数据库结构:

Posts -> postId -> postDocument -> likedBy -> uid

我想要做的是仅显示在“ likedBy”子集合中没有当前用户的uid的帖子。这本身是不可能的,但是我正在努力寻找一个半体面的工作。

当前,我收到所有帖子,并在本地进行检查以显示正确的帖子。也许魔术云功能可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

通过维护用户的feed,然后仅在运行时调用它,您可能会发现成功和用例之外的问题。我利用了这种方法,发现我有很大的自由度,而Cloud Functions让我决定显示哪种类型的帖子,以及在什么更改下将新帖子添加到用户的供稿中。

我这样做的方法是,我通过onCreate云功能查找新帖子,然后查找谁应该看到该帖子,等等,然后将其添加到他们的每个供稿中。

在您的情况下,通过在帖子中寻找新的喜欢可以看到它正在被使用。对于喜欢的人,它可以从用户的供稿中删除该帖子。

我用来向用户的关注者的供稿中添加帖子的功能示例(为简便起见,已对其进行了编辑)。通过使用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"));
          });
  });

数据库看起来像这样:

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

const db = admin.firestore()