Как проверить, содержит ли массив две определенные строки в Firestore?

Я пытаюсь создать чат-приложение, в котором могут быть чаты с максимум двумя пользователями. У меня есть коллекция chatrooms и документы чата с полем массива members, которое содержит два идентификатора пользователя. Знайте, прежде чем я смогу создать новый чат, я хочу проверить, есть ли у двух конкретных пользователей уже чат, поэтому мне нужно запросить идентификаторы двух пользователей с моими документами.

В конце концов, я просто хочу проверить, существует ли чат, а затем вернуть false, а затем попытаться создать другой чат с теми же двумя конкретными идентификаторами пользователей.

Моя проблема заключается в запросе содержимого массива.

я пробовал с

chatroomsCollection.where('members', '==', firstUserID).where('members', '==', secondUserID).limit(1).get() 

и пытался

chatroomsCollection.where('members','array-contains', firstUserID).where('members', 'array-contains', secondUserID).limit(1).get()

но это не работает.

Возможно ли вообще запросить несколько строк с элементами внутри массива в noSQL?

К вашему сведению, нет такого языка, как «NoSQL». То, что вы спрашиваете, относится к Firestore. Это база данных типа NoSQL, что означает отсутствие реляционных запросов, таких как соединения.

Doug Stevenson 16.03.2019 21:42

Первая попытка не удалась, потому что вы сравниваете элементы массива со строкой идентификатора пользователя. Второй терпит неудачу, потому что вы не можете иметь два «массива-контейнера» в одном запросе, см. раздел о составных запросах: firebase.google.com/docs/firestore/query-data/queries

SnorreDan 16.03.2019 21:49
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
2
2
1 662
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

members: {
    'uid1': true,
    'uid2': true
}

Затем вы можете запрашивать документы следующим образом:

chatroomsCollection
    .where('members.uid1', '==', true)
    .where('members.uid2', '==', true)
    .limit(1)
    .get()

Согласен, наверное, это выход.

SnorreDan 16.03.2019 21:49

Я уже видел эту структуру в примере, но не был уверен в двух вещах, смогу ли я реализовать ее с этой структурой. 1. Могу ли я по-прежнему использовать array-contains, если я хочу запросить все чаты, в которых состоит пользователь? 2. Должен ли я выполнять два отдельных запроса, если порядок строк, передаваемых в запросе, обратный?

Constantin Beer 17.03.2019 05:25

@ConstantinBeer 1. Нет, не для объектов. 2. Нет.

Doug Stevenson 17.03.2019 05:58

@DougStevenson Вы мне очень помогли и сэкономили много времени. Спасибо!

Constantin Beer 17.03.2019 07:22

В настоящее время я использую такую ​​​​структуру, но с атрибутами с именами «user1» и «user2», мне нужен запрос, чтобы найти, есть ли документ, который имеет две определенные строки под «user1» и «user2». Проблема в том, что я не знаю заранее порядок. Итак, пример: у меня есть две входные строки: "Apple" и "Banana", и я хочу проверить, существует ли этот документ - есть два варианта: "user1" = "Apple", "user2" = "Banana" ИЛИ " пользователь1" = "Банан", "пользователь2" = "Яблоко". Обе эти ситуации действительны, и я хочу получить их. Как бы я написал этот запрос?

Alexandr Čížek 23.08.2020 20:16

Другие вопросы по теме