Проверка базы данных Firebase, существует ли элемент в ListField во Flutter - PullRequest
0 голосов
/ 07 января 2020

У меня есть база данных в реальном времени на базе FireBase, которая состоит из ListFields. Среди этих полей одно поле, participants, представляет собой список строк и два имени пользователя. Я хочу сделать запрос к базе данных firebase, чтобы он возвращал документы, в которых определенное имя пользователя присутствует в списке participants.

Структура моего документа следующая:

Document Structure

Я хочу сделать запрос таким, что Firebase возвращает все документы в который participants список состоит aniruddh. Я использую Flutter с плагинами flutterfire.

1 Ответ

0 голосов
/ 07 января 2020

Ваша текущая структура данных позволяет легко найти участников для разговора. Однако это не облегчает поиск разговоров для пользователя.


Одна альтернативная структура данных, которая облегчает это, - хранить участников в следующем формате:

imgUrls: {},
participants: {
  "aniruddh": true,
  "trubluvin": true
}

Теперь вы можете технически запрашивать разговоры пользователя с чем-то вроде:

db.child("conversations").orderByChild("participants/aniruddh").equalTo(true)

Но это не очень хорошо масштабируется, так как вам нужно будет определить индекс для каждого пользователя.


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

userConversations: {
  "aniruddh": {
    "-LxzV5LzP9TH7L6BvV7": true
  },
  "trubluvin": {
    "-LxzV5LzP9TH7L6BvV7": true
  }
}

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

Также см. Мой ответ здесь:

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