Я пытаюсь создать чат-приложение, в котором могут быть чаты с максимум двумя пользователями.
У меня есть коллекция 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?
Первая попытка не удалась, потому что вы сравниваете элементы массива со строкой идентификатора пользователя. Второй терпит неудачу, потому что вы не можете иметь два «массива-контейнера» в одном запросе, см. раздел о составных запросах: firebase.google.com/docs/firestore/query-data/queries

Если вы хотите сделать такой запрос, вам понадобится другая структура данных. Вместо этого рассмотрим поле типа объекта, подобное этому:
members: {
'uid1': true,
'uid2': true
}
Затем вы можете запрашивать документы следующим образом:
chatroomsCollection
.where('members.uid1', '==', true)
.where('members.uid2', '==', true)
.limit(1)
.get()
Согласен, наверное, это выход.
Я уже видел эту структуру в примере, но не был уверен в двух вещах, смогу ли я реализовать ее с этой структурой. 1. Могу ли я по-прежнему использовать array-contains, если я хочу запросить все чаты, в которых состоит пользователь? 2. Должен ли я выполнять два отдельных запроса, если порядок строк, передаваемых в запросе, обратный?
@ConstantinBeer 1. Нет, не для объектов. 2. Нет.
@DougStevenson Вы мне очень помогли и сэкономили много времени. Спасибо!
В настоящее время я использую такую структуру, но с атрибутами с именами «user1» и «user2», мне нужен запрос, чтобы найти, есть ли документ, который имеет две определенные строки под «user1» и «user2». Проблема в том, что я не знаю заранее порядок. Итак, пример: у меня есть две входные строки: "Apple" и "Banana", и я хочу проверить, существует ли этот документ - есть два варианта: "user1" = "Apple", "user2" = "Banana" ИЛИ " пользователь1" = "Банан", "пользователь2" = "Яблоко". Обе эти ситуации действительны, и я хочу получить их. Как бы я написал этот запрос?
К вашему сведению, нет такого языка, как «NoSQL». То, что вы спрашиваете, относится к Firestore. Это база данных типа NoSQL, что означает отсутствие реляционных запросов, таких как соединения.