Составной запрос с картой в array firestore

#firebase #google-cloud-firestore #google-cloud-functions

#firebase #google-облако-firestore #google-cloud-функции

Вопрос:

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

 appointments(collection)
    doc1(document)
        people(array)
            person1(map)
                userId(field)
            person2(map)
                userId(field)
  

Мне нужно получить все документы (например, doc1), в которых есть люди с определенным идентификатором пользователя, который является константой. У меня есть общее представление о том, что должно произойти, но я не совсем понимаю запрос. В настоящее время у меня есть следующее:

 const snapshot = db.collection('appointments').where('people.userId', 'array_contains', userId).get()
          .then(function(querySnapshot) {
              querySnapshot.forEach(function(doc) {
              db.collection('appointments').doc(doc.id).update({
                //Change the data I need to change
              },{merge:true});
           });
});
  

Я не могу понять, как построить это предложение where. Кто-нибудь может мне помочь с этим?
Заранее спасибо!

Ответ №1:

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

Одна вещь, которую вы можете сделать, это создать новое поле, содержащее только строки идентификатора пользователя, и использовать запрос, содержащий массив, для этого массива.

Комментарии:

1. Как бы это выглядело тогда, потому что, если бы у меня был отдельный массив с идентификаторами пользователя, я бы не знал, какие данные обновлять. Я что-то здесь упускаю?

2. Вам пришлось бы написать код для обновления всех дублирующихся данных, если что-то изменится. Это характерно для баз данных типа nosql, где данные дублируются.

3. Итак, если бы я создал массив со всеми идентификаторами пользователей в нем, я мог бы найти все документы, в которых мне нужно что-то изменить, затем выполнить цикл по массиву и проверить, есть ли у меня правильные данные (с помощью change.before.data()), затем изменить данные, это сработало бы?