programing

Firestore 루트 컬렉션의 모든 문서 및 하위 컬렉션 가져오기

bestprogram 2023. 7. 6. 22:23

Firestore 루트 컬렉션의 모든 문서 및 하위 컬렉션 가져오기

내가 이런 구조를 가지고 있다고 말합니다.

    A (collection): { 
       a (doc): {
           name:'Tim',
           B (collection):{
               b (doc): {
                      color:'blue'
               }
             }
          }
    }

어디에A그리고.B수집하는 동안a그리고.b문서입니다.
루트 문서에 포함된 모든 내용을 하나의 쿼리로 가져올 수 있는 방법이 있습니까?
이렇게 쿼리하면

db.collection("A").doc("a").get()

나는 단지name:'Tim'필드. 제가 원하는 것은 또한 B의 모든 서류를 받는 것입니다.
기본적으로 내 질문이 돌아오기를 바랍니다.

         {
           user:'Tim',
           B (collection):{
               b (doc): {
                      color:'blue'
               }
             }
          }

가능합니까? 아니면 정말로 각 컬렉션에 대해 하나씩 여러 개의 쿼리를 만들어야 합니까? :/?

사용자 프로필을 나타내는 매우 깊은 중첩된 컬렉션 트리가 있다고 가정하면 사용자 프로필을 로드할 때마다 읽기 요청이 여러 번 발생하기 때문에 비용이 엄청나게 증가할 것입니다.1 x N여기서 N은 내 나무의 깊이입니다 :/.

각 풀의 비용이 걱정되는 경우 완벽한 구조를 위해 선호하는 것이 아니라 공통된 뷰/풀 요구에 따라 데이터를 구성해야 합니다.매번 이러한 항목을 하나로 묶어야 하는 경우, 실제로 문서의 하위 컬렉션일 필요가 없는 항목에 대해 "맵"을 사용하는 것을 고려하십시오.

이 예에서 "기본 설정"은 지도입니다.

{
  user: "Tim",
  preferences: {
    color: "blue",
    nickname: "Timster"
  }
}

각 문서의 크기도 1MB로 제한됩니다. 따라서 로그 레코드와 같이 확장되고 계속 확장되는 것을 이 사용자를 위해 저장해야 하는 경우 로그를 원하는 경우에만 풀링되는 하위 컬렉션으로 분할하여 각 로그 항목을 별도의 문서로 만드는 것이 좋습니다.또한 모든 사용자에 대한 모든 로그를 별도의 상위 컬렉션에 저장할지 또는 각 사용자의 하위 컬렉션에 저장할지 여부는 로그를 어떻게 풀링할 것인지, 풀링 비용과 균형을 맞춰 빠른 속도를 낼 것인지에 따라 결정됩니다.이 사용자에게 최근 10건의 검색을 표시할 경우 검색 로그가 하위 컬렉션으로 적합합니다.분석을 위해 모든 사용자에 대한 모든 검색 데이터를 풀링하는 경우 한 번에 모든 로그를 풀링하여 각 사용자의 로그를 개별적으로 풀링할 필요를 방지할 수 있으므로 별도의 상위 수준 컬렉션이 적합합니다.

당신은 또한 편리한 목적을 위해 당신의 당김과 약속을 함께 묶을 수 있습니다.

// Get reference to all of the documents
console.log('Retrieving list of documents in collection');
let documents = collectionRef
  .limit(1)
  .get()
  .then((snapshot) => {
    snapshot.forEach((doc) => {
      console.log('Parent Document ID: ', doc.id);

      let subCollectionDocs = collectionRef
        .doc(doc.id)
        .collection('subCollection')
        .get()
        .then((snapshot) => {
          snapshot.forEach((doc) => {
            console.log('Sub Document ID: ', doc.id);
          });
        })
        .catch((err) => {
          console.log('Error getting sub-collection documents', err);
        });
    });
  })
  .catch((err) => {
    console.log('Error getting documents', err);
  });

Cloud Firestore에서 쿼리를 실행하는 것은 기본적으로 매우 간단합니다.이러한 유형의 쿼리는 지원되지 않지만, Google이 향후 고려할 수도 있습니다.

할 수 수가 수 Matt R 답변대추에하, babel 사비사아/기을를용수경있할우는용여하있더수, 적은코드로동다니얻습결오니을일한를과가거동나기아▁with▁adding(,▁result▁same▁if).catch/then):

// Get reference to all of the documents
console.log("Retrieving list of documents in collection");
let documents = await collectionRef.get();
documents.forEach(async doc => {
    console.log("Parent Document ID: ", doc.id);
    let subCollectionDocs = await collectionRef.doc(doc.id).collection("subCollection").get()
    subCollectionDocs.forEach(subCollectionDoc => {
        subCollectionDoc.forEach(doc => {
            console.log("Sub Document ID: ", doc.id);
        })
    });
});

언급URL : https://stackoverflow.com/questions/46875966/firestore-get-all-docs-and-subcollections-of-root-collection