Запросить все документы в коллекции Firestore без цикла
Я работал над переходом небольшого проекта Firebase в новый, похожий на Firestore db из-за его более интересного характера, но у меня проблемы с простой проблемой запроса.
Я пытаюсь получить все документы в коллекции, в случае, если каждый документ является клубом, а коллекция - это все клубы.
В Firebase я смог сделать что-то вроде:
export function fetchClubs() {
const Club = firestore.ref('clubs');
return dispatch => {
Club.on('value', snapshot => {
dispatch({
type: FETCH_CLUBS,
payload: snapshot.val()
})
})
}
}
snapshot
будет иметь всю необходимую мне информацию внутри него.
Я пытаюсь воспроизвести это с помощью Firestore, но у меня есть только возможность найти решение, которое включает в себя создание нового массива и циклизацию результатов, а затем добавление каждого результата к этому.
Вот моя попытка Firestore с использованием немного отличающегося синтаксиса Firestore
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot)
dispatch({
type: FETCH_CLUBS,
payload: querySnapshot.val()
})
})
}
}
Если у вас есть какие-либо идеи, вся помощь будет принята с благодарностью! Спасибо!
(это мой первый пост stackoverflow, иди просто! :))
Редактировать:
Пример из документов Firestore о том, как получить все документы в коллекции.
db.collection("cities").where("capital", "==", true)
.get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
Изменить 2:
Мое новое решение для получения документов в полезном массиве с помощью.docs и.data(). Все еще кажется неэффективным, так как мне приходится перебирать документы и извлекать полезную информацию по одному.
export function fetchClubsStore() {
const Clubs = firestore.collection('clubs');
var clubs = [];
return dispatch => {
Clubs.get().then(querySnapshot => {
console.log("clubs snapshot: ", querySnapshot.docs)
_.each(querySnapshot.docs, function(data){
clubs.push(data.data());
})
dispatch({
type: FETCH_CLUBS,
payload: clubs
})
})
}
}
Ответы
Ответ 1
Разница между базой данных Firebase Realtime и Firestore заключается в том, что RTDB - это просто объект JSON, размещенный в облаке. Таким образом, нет концепции документов и нет коллекций данных.
Объект значения в снимке запроса, полученном из RTDB, является просто объектом JSON. Следовательно, вы можете получить доступ к узлам первого уровня по их ключам (а также к узлам любого уровня по их ключам)
Если вы пришли из RTDB, вы заметите разницу в том, что Cloud Firestore имеет коллекции и документы. Таким образом, результаты вашего запроса по своей сути будут коллекциями данных, а не объектом JSON. Документы, полученные из запроса, не могут быть получены как один большой объект JSON.
Циклы по результату запроса - это правильный способ работы с Cloud Firestore.