我知道Firestore不支持'!='查询,但是我想知道是否有人遇到过以下类似情况:
这是我的数据库结构:
Posts -> postId -> postDocument -> likedBy -> uid
我想要做的是仅显示在“ likedBy”子集合中没有当前用户的uid的帖子。这本身是不可能的,但是我正在努力寻找一个半体面的工作。
当前,我收到所有帖子,并在本地进行检查以显示正确的帖子。也许魔术云功能可以做到这一点吗?
答案 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()