ИЛИ в whereField, чтобы получить документ из Firestore - PullRequest
0 голосов
/ 17 октября 2019

Я использую чат с помощью Firestore. Вот структура Firestore:

| - Чаты (коллекция)
| - AutoID (документ)
| --- user1ID (String)
| --- user2ID (String)
| --- поток (коллекция)
... и затем поток имеет дополнительные поля.

Чтобы получить чат между двумя пользователями, я извлекаю его как:

let db = Firestore.firestore().collection("Chats")
    .whereField("user1ID", isEqualTo: Auth.auth().currentUser?.uid!)
    .whereField("user2ID", isEqualTo: user2UID!)

Работает нормально, если пользователь 1 является текущим пользователем, в противном случае, если я открываю чат с другой учетной записи, а текущий пользователь является пользователем 2. Он не получает этот документ.

При поиске я обнаружил, что могупользователь arrayContains. Поэтому вместо этого я создал массив с именем users и добавил в него оба этих идентификатора. Теперь структура выглядит следующим образом: | - Чаты (коллекция)
| - AutoID (документ)
| --- users (Array)
| ---- 0: user1ID (String)
| ---- 1: user2ID (String)
| --- поток (коллекция)
... и затем поток имеет дополнительные поля.

Но когда я делаю:

let db2 = Firestore.firestore().collection("Chats")
    .whereField("users", arrayContains: Auth.auth().currentUser?.uid!)
    .whereField("users", arrayContains: user2UID!)

Будет получен первый найденный документ с currentUser.uid (я не проверял его, я говорю это на основании прочитанной документации).

Итак, как мне получить этот чат, если массив содержит оба идентификатора?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Как правило, я называю документ для двух пользователей, имеющих чат. Таким образом, вам не нужно делать запрос, чтобы найти документ, но вы можете просто получить к нему прямой доступ на основе идентификаторов UID.

Чтобы гарантировать, что порядок, в котором указаны идентификаторы UID, не имеет значения, я тогдадобавить их в лексикографическом порядке. Пример этого см. В моем ответе здесь: Лучший способ управления каналами чата в Firebase

1 голос
/ 17 октября 2019

Во-первых, у документа, который вы обрисовали, нет полей типа array, поэтому arrayContains не поможет. arrayContains соответствует только элементам поля, содержащего массив.

Для вашей текущей структуры документа один запрос не сможет получить все документы между обоими пользователями, поскольку Cloud Firestore не предлагаетлюбые логические запросы типа OR . Вам понадобятся два запроса: один для получения всех документов, где user1 - текущий пользователь, и один - для user2 - текущий пользователь. Затем вы можете объединить результаты этих двух запросов в коде клиента, чтобы построить весь список.

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