Запрос Firestore, где карта содержит строку - PullRequest
0 голосов
/ 03 января 2019

Структура данных:

houses (collection)
  name (string)
  users (map)
    90c234jc23 (map)
      percentage: 100% (string/number)

Правила:

allow read: request.auth.uid in resource.data.users;

Проблема в том, что я пытаюсь запросить дома, которые принадлежат пользователю:

FirebaseFirestore.getInstance().collection(House.COLLECTION)
//                .whereArrayContains(House.USERS_FIELD, currentUser.getUid()) // does not work
                .whereEqualTo("users." + currentUser.getUid(), currentUser.getUid()) // does not work either
                .get()

Результат не возвращается.

1 Ответ

0 голосов
/ 03 января 2019

Этот запрос не работает, потому что ваше поле users является картой, а не массивом.

.whereArrayContains(House.USERS_FIELD, currentUser.getUid())

Этот запрос

.whereEqualTo("users." + currentUser.getUid(), currentUser.getUid())

не работает, потому что значение вашей карты для users.<uid> является строкой, которая говорит percentage: xx%, и этот оператор проверяет, если percentage: xx% === <uid>, что ложно.

И эта стратегия будет проблематичной, поскольку вы не можете выполнять запросы, чтобы найти элементы, которые «не равны нулю» или «строки не пусты» и т. Д.

Я предполагаю, что это процентная доля владения пользователя в доме (?). Если это так, возможно, вам больше повезет, если вы попытаетесь структурировать данные своего домашнего документа, как это, если хотите сохранить ту же структуру документа, что и в вашем вопросе

{
  name: "The Residence",
  users: {
    uid1: 80,
    uid2: 20
  }
}

Это позволит вам сделать запрос, такой как

.whereGreaterThan("users." + currentUser.getUid(), 0)

чтобы найти пользователей, которым принадлежат доли в этом доме.

Но справедливое предупреждение: как только вам понадобится составные индексы , у вас начнутся проблемы с поддержкой этой структуры. Вместо этого вы можете захотеть сохранить массив пользователей, владеющих этим домом, для удобства запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...