Firestore, где запрос с параметром не работает

#javascript #firebase #google-cloud-firestore

#javascript #firebase #google-облако-firestore

Вопрос:

У меня есть запрос, который работает не так, как я ожидаю. У меня есть коллекция под названием «игры», в которой есть несколько документов. У каждого документа есть массив с именем ‘hiScores’, который состоит из результатов этого раунда. Я хотел бы запросить все игры для конкретного игрока, например:

 .where('hiScores.playerName', '==', 'David Lamm')
  

Это ничего не возвращает. У меня нет проблем при запросе переменной верхнего уровня в документе. Что я сделал не так?

База данных: db

 db.collection('games')
  .where('hiScores.playerName', '==', 'David Lamm')
  .get()
  .then(function(querySnapshot) {
    console.log('Davids games:')

    querySnapshot.forEach(function(doc) {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch(function(error) {
    console.log("Error getting documents: ", error);
  }
);
  

Ответ №1:

Проблема в том, что поле hiScores является массивом, а не объектом. Вы можете сказать, что это массив, потому что первый непосредственный элемент массива на скриншоте имеет индекс 0. Вы пытаетесь запросить hiScores, как будто это один объект с одним свойством, называемым PlayerName.

Firestore не поддерживает запрос свойств объекта внутри полей массива. Если у вас есть поле массива, вы можете запрашивать только для поиска документов, в массиве которых присутствует весь элемент (запрос arrayContains).

Ответ №2:

Как указал Doug, в настоящее время это невозможно в firestore.

Вы можете создать массив строк верхнего уровня в каждой игре с именем playerNames[]. Затем используйте условие where для имен игроков с array_contains.