Firestore:循环访问集合中的文档

时间:2019-03-25 23:37:42

标签: firebase google-cloud-firestore

我想做一些非常简单的事情,但是不确定用Firestore做到这一点的最佳方法。

我有一个ads收藏。

每次访问ad时,我都想更新accessed属性时间戳,这样我就可以显示未在最长时间内显示的广告。

我的安全规则仅允许携带有效载荷为admin:true的令牌的用户创建/修改ads

因此,由于用户不是管理员,因此无法在应用内每次访问广告时更新时间戳。

我曾考虑为此创建一个函数,但意识到没有onGet函数可以让我做到这一点(https://firebase.google.com/docs/functions/firestore-events

我仍然看不到允许任何用户修改单个属性。

在Firestore中执行此操作的合适方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以通过创建一个相当全面的规则验证来解决此问题,在此过程中,您要检查除accessed以外的所有其他字段是否均未更改。您可以按照custom claims中的说明,使用the answer on this post来实现管理员角色概念。

要检查除accessed以外的所有其他字段均未更改,需要您逐一列出并检查所有字段。

service cloud.firestore {
  match /databases/{database}/documents {

    match /ads/{id} {
        allow read: if true; 
      allow write: if request.auth.token.admin == true 
            || (request.resource.data.someField == resource.data.someField
        && request.resource.data.anotherField == resource.data.anotherField);
    }
  }
}

另一种方法是,您可以创建一个与callable cloud function类似的the Unix touch command。您只需在每次阅读广告时都从客户端调用它,就可以安全地在该函数中更新帖子上的accessed字段。

export const touchAd = functions.https.onCall((data, context) => {
    const adId = data.id;
    return admin.firestore().collection('ads').doc(adId).update({
        accessed: firebase.firestore.FieldValue.serverTimestamp(),
    }));
});