小規模な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()を使用して、使用可能な配列でドキュメントを取得するための新しいソリューション。文書をループして使用可能な情報を1つずつ抽出する必要があるため、依然として非効率的です。
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
})
})
}
}
Firebase Realtime DatabaseとFirestoreの違いは、RTDBは基本的にクラウドでホストされるJSONオブジェクトにすぎないことです。したがって、ドキュメントの概念やデータのコレクションはありません。
RTDBから取得するクエリスナップショットの値オブジェクトは、単なるJSONオブジェクトです。したがって、キーによって第1レベルのノードにアクセスできます(また、キーによってすべてのレベルのノードにアクセスできます)
RTDBを使用している場合は、Cloud Firestoreにコレクションとドキュメントがあることに違いがあります。したがって、クエリ結果は本質的にJSONオブジェクトではなくデータのコレクションになります。クエリから取得されたドキュメントは、単一の大きなJSONオブジェクトとして取得することはできません。
クエリ結果をループすることは、Cloud Firestoreを操作する正しい方法です。