Как выполнять составные запросы с логическим И для массива в Cloud Firestore? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть коллекция, документы которой имеют свойство массива members, которое содержит идентификаторы пользователей. Мне нужно найти документы, члены которых являются парой идентификаторов пользователей, например:

enter image description here

Из документы для составных запросов я вижу, как сделать OR, но мне нужен AND, потому что мне нужны документы, содержащие оба идентификатора пользователя (что на самом деле делает do c уникальным ). В документах говорится, что

you can include at most one array-contains or array-contains-any clause in a compound query

, поэтому следующий код не работает (я проверял и на самом деле возвращает ошибку):

const conversation = await firebaseDb.collection(collectionName)
      .where('members', 'array-contains', userId)
      .where('members', 'array-contains', otherUserId)
      .get();

Я тоже пробовал:

const conversation = await firebaseDb.collection(collectionName)
      .where('members', 'array-contains', [userId, otherUserId])
      .get();

но ничего не возвращает.

Действительно ли возможно выполнить логическое AND для значений массива в Firestore do c?

1 Ответ

3 голосов
/ 24 апреля 2020

Самое простое решение, которое я могу придумать, - сохранить эти идентификаторы в карте, а не в массиве. Итак, ваша members карта должна выглядеть следующим образом:

members
 |
 --- M1fB...szi1: true
 |
 --- wXam...69A2: true

Теперь вы можете просто выполнить запрос, используя:

const conversation = await firebaseDb.collection(collectionName)
  .where('members.' + userId, '==', true)
  .where('members.' + otherUserId, '==', true)
  .get();

И это действительно операция AND.

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