Функции Firestore / Cloud: поиск документа в массиве ссылок на документы, соответствующих критериям - PullRequest
0 голосов
/ 14 марта 2020

Использование облачных функций Firebase Я бы хотел найти документы, которые содержат определенный другой документ, в массиве ссылок на документы. Моя структура выглядит следующим образом:

Users 
   name
   email
   cars
      ref to cars/car1 for example
      ref to cars/car2 for example
Cars
   registration
   make
   model

Есть несколько пользователей и несколько автомобилей. Мне нужно искать пользователей, у которых есть определенный «автомобиль» в их массиве автомобилей.

Я пытаюсь написать это в облачной функции и получить следующее:

admin.firestore()
              .collection('users')
              .where('cars', 'array-contains', registration)
              .get().then(doc => {
                console.log("TESTING: found the user " + doc.data().email)
                return
              }).catch(error => {
                console.error(error);
              });

Я знаю, что в настоящее время просто выполняется поиск регистрационной строки в массиве. Есть ли в любом случае для поиска конкретную c ссылку на документ. Я использую Node.js.


Рабочий код для получения всех документов, имеющих ссылку на документ в массиве;

// Notify the owner of the car
            admin.firestore()
              .collection('users')
              .where('cars', 'array-contains', carRef)
              .get().then(snapshot => {
                snapshot.forEach(doc => {
                  console.log("TESTING found the user " + doc.data().email);
                  const message = {
                    notification: {
                      body: 'Your vehicle (' + carReg + ') recieved a report. Tap here to see!',
                    },
                    token: doc.data().cloudMessagingToken
                  };
                  sendMessage(message);
                });
                return
              }).catch(error => {
                console.error("Error finding a user that has the car in their garage");
                console.error(error);
              });

1 Ответ

0 голосов
/ 14 марта 2020

Если вы хотите выполнить запрос, используя поля ссылочного типа, вам нужно будет предоставить объект типа DocumentReference для запроса. Если вы передаете DocumentReference на автомобиль, запрос должен работать. Например:

const ref = admin.firestore().collection('Cars').doc(id)

, где id - идентификатор документа.

Однако вы не можете выполнять поиск по значениям полей внутри ссылочного документа. Запросы Firestore работают одновременно только с данными в одной коллекции. Поскольку ваши данные организованы прямо сейчас, невозможно сделать один запрос для всех пользователей, у которых есть ссылки на автомобили с указанным c полем регистрационной строки. Для этого запроса вам также потребуется хранить массив строк регистрации для каждого пользователя, к которому вы можете обращаться с помощью array-contains.

Да, это включает дублирование данных и называется «денормализация». Это очень часто встречается в базах данных без sql, чтобы включить нужные вам запросы.

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