В документации указано, что вы можете выполнить запрос, сравнивая строку с другим строковым значением, например:
citiesRef.where('name', '>=', 'San Francisco');
citiesRef.where('state', '>=', 'CA').where('state', '<=', 'IN');
Затем в документации есть ролей показывает, как применять роли в документах Firestore.Однако не показано, как запросить это .. Но, как показано в примере выше, это должно работать следующим образом:
citiesRef.where(`roles.${user.uid}`, '>', '');
, так что этот запрос выше, должен возвращать все документы, где любое значение больше, чем пустая строка,верно?
В моем коде у меня есть коллекция организаций с одним документом:
{
"name": "MyAmazingCompany",
"roles": {
"my-user-uid": "owner"
}
}
И если я попытаюсь запросить организации, в которых у меня есть роль, подобная этой:
organizationsRef.where(`roles.${user.uid}`, '>', '');
Я просто получу Uncaught Error in onSnapshot: Error: Missing or insufficient permissions.
в консоли браузера (используя пакет Firebase npm версии 5.1.0 и пробовал также 5.0.3).
Просто чтобы убедиться, что у меня должен быть доступ к этому документу,следующий запрос проверен, он работает и возвращает одну организацию.
organizationsRef.where(`roles.${user.uid}`, '==', 'owner');
Так что же не так?
Также здесь кто-то утверждает, что он должен работать: Firestore select где находитсяне нуль
И вот мои правила:
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function getRole(rsc) {
// Read from the "roles" map in the resource (rsc).
return rsc.data.roles[request.auth.uid];
}
function isOneOfRoles(rsc, array) {
// Determine if the user is one of an array of roles
return isSignedIn() && (getRole(rsc) in array);
}
match /organizations/{organizationId} {
allow read: if isOneOfRoles(resource, ['owner']);
allow write: if isOneOfRoles(resource, ['owner']);
}
}
}
Как я уже сказал, это работает, если я сравниваю, если роль является владельцем, но я хочу получить результаты, если пользователь uidсуществует в массиве ролей, несмотря ни на чтороль, которую она играет.