#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-облако-firestore
Вопрос:
У меня есть запрос, который работает не так, как я ожидаю. У меня есть коллекция под названием «игры», в которой есть несколько документов. У каждого документа есть массив с именем ‘hiScores’, который состоит из результатов этого раунда. Я хотел бы запросить все игры для конкретного игрока, например:
.where('hiScores.playerName', '==', 'David Lamm')
Это ничего не возвращает. У меня нет проблем при запросе переменной верхнего уровня в документе. Что я сделал не так?
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.