gpt4 book ai didi

java - 如何为 Firebase Firestore 多对多关系编写读取规则

转载 作者:行者123 更新时间:2023-11-30 10:15:59 25 4
gpt4 key购买 nike

我在 Firebase Firestore 中有以下数据结构来表示客户端和用户之间的多对多关系:

Clients
clientId1 {
users (object): {
userId1: true
userId2: true
}
}
clientId2 {
users (object): {
userId1: true
}
}

我在 Android 上使用以下查询查询它:

  db.collection("clients").whereEqualTo("users."+uid, true);

对于 userId2,查询应该只返回 clientId1。

如果我将规则设置为 (allow read: if true;),当我执行上面的查询时,我会返回正确的客户端。

我还想设置一个数据库规则来防止 userId2 看到 clientId2。

我试过这条规则,但没有返回任何结果:

match /clients/{clientId} {

//Allow read if the user exists in the user collection for this client
allow read: if users[request.auth.uid] == true;

}

我也试过:

match /clients/{clientId} {

//Allow read if the user exists in the user collection for this client
allow read: if resource.data.users[request.auth.uid] == true;

}

但是以上规则都不返回任何客户端。

如何编写规则?

最佳答案

我要回答我自己的问题,因为我只是在做一些愚蠢的事情。

我的数据结构很好,我的规则的正确语法是:

match /clients/{clientId} {

//Allow read if the user exists in the user collection for this client
allow read: if resource.data.users[request.auth.uid] == true;

}

鉴于此:

Cloud Firestore evaluates a query against its potential result set instead of the actual field values for all of your documents. If a query could potentially return documents that the client does not have permission to read, the entire request fails.

此 Android 查询确实为规则正确实现了正确的过滤器:

db.collection("clients").whereEqualTo("users."+uid, true);

我还没有正确实现我的适配器。我想先看看我是否能得到正确的数据结构/规则/查询。我是从另一个正在监听整个客户端集合(不符合规则)的监听器调用它的,因此没有调用此查询。早些时候,当我将规则设置为 (allow read: if true;) 时,初始监听器正在执行我的查询并返回正确的结果。这让我相信我的规则是不正确的,但事实并非如此。

关于java - 如何为 Firebase Firestore 多对多关系编写读取规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com