bestsource

Firebase Cloud Firestore에서 문서에 하위 컬렉션을 추가하는 방법

bestsource 2023. 6. 28. 21:51
반응형

Firebase Cloud Firestore에서 문서에 하위 컬렉션을 추가하는 방법

설명서에는 문서에 하위 컬렉션을 추가하는 방법에 대한 예가 나와 있지 않습니다.문서를 모음에 추가하는 방법과 문서에 데이터를 추가하는 방법을 알고 있지만, 문서에 모음(하위 모음)을 추가하는 방법은 무엇입니까?

다음과 같은 방법이 있어야 하지 않을까요?

dbRef.document("example").addCollection("subCollection")

2021년 1월 13일 편집:

어레이 구성원 자격에 대한 업데이트된 문서에 따르면, 이제 다음을 사용하여 어레이 값을 기준으로 데이터를 필터링할 수 있습니다.whereArrayContains()방법. 과 같습니다간단한 예는 다음과 같습니다.

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

이 쿼리는 지역 필드가 west_coast를 포함하는 배열인 모든 도시 문서를 반환합니다.배열에 쿼리한 값의 인스턴스가 여러 개 있는 경우 문서는 결과에 한 번만 포함됩니다.


다음과 유사한 데이터베이스 구조를 가진 채팅 응용프로그램이 있다고 가정합니다.

enter image description here

subCollection문서에서 다음 코드를 사용하십시오.

DocumentReference messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1");

작성messages및 콜링 집과명소수명addDocument()1000배는 확실히 비싸겠지만, 파이어스토어는 이렇게 작동합니다.쓰기 횟수가 중요하지 않은 곳에서 원하는 경우 Firebase Realtime Database로 전환할 수 있습니다.그러나 Firestore에서 지원되는 데이터 유형과 관련하여 실제로 어레이가 지원되므로 어레이를 사용할 수 있습니다.Firebase Realtime 데이터베이스에서 사용할 수도 있습니다.array하는 여러 규칙을할 수 입니다.Firebase에서 어레이를 사용하지 말 것을 권장하는 여러 가지 이유 중 하나는 보안 규칙을 작성할 수 없게 하기 때문입니다.

Cloud Firestore는 어레이를 저장할 수 있지만 어레이 멤버를 쿼리하거나 단일 어레이 요소를 업데이트할 수 없습니다.그러나 Cloud Firestore의 다른 기능을 활용하여 이러한 종류의 데이터를 모델링할 수 있습니다.여기 그것이 매우 잘 설명된 설명서가 있습니다.

또한 1000개의 메시지로 하위 컬렉션을 작성하고 모든 메시지를 데이터베이스에 추가하며 단일 레코드로 간주할 수 없습니다.모든 메시지에 대해 총 1000개의 쓰기 작업으로 간주됩니다.위의 그림은 데이터를 검색하는 방법을 보여주는 것이 아니라 다음과 같은 데이터베이스 구조를 보여줍니다.

collection -> document -> subCollection -> document

하위 컬렉션이 추가 데이터가 있는 필드인 문서 내에서가 아니라 하위 컬렉션이 ID 값을 수집 수준에 저장하는 변형이 있습니다.

이것은 추가 문서를 드릴로 통과하지 않고 1대ID 매핑을 연결하는 데 유용합니다.

function fireAddStudentToClassroom(studentUserId, classroomId) {

    var db = firebase.firestore();
    var studentsClassroomRef =
        db.collection('student_class').doc(classroomId)
          .collection('students');

    studentsClassroomRef
        .doc(studentUserId)
        .set({})
        .then(function () {
            console.log('Document Added ');
        })
        .catch(function (error) {
            console.error('Error adding document: ', error);
        });
}

@Alex의 답변 덕분에

이 답변은 문서에 컬렉션을 추가할 것을 명시적으로 요청하는 여기서 원래 질문과 약간 다릅니다.하지만 이 시나리오에 대한 솔루션을 검색하고 문서나 SO에서 아무런 언급도 찾지 못한 후, 이 게시물은 결과를 공유할 수 있는 합리적인 장소로 보입니다.

내 코드는 다음과 같습니다.

firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).set(wordData)
  .then(function() {
    console.log("Collection added to Firestore!");
    var promises = [];
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('AudioSources').doc($scope.accentDialect).set(accentDialectObject));
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('FunFacts').doc($scope.longLanguage).set(funFactObject));
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('Translations').doc($scope.translationLongLanguage).set(translationObject));
    Promise.all(promises).then(function() {
      console.log("All subcollections were added!");
    })
    .catch(function(error){
      console.log("Error adding subcollections to Firestore: " + error);
    });
  })
  .catch(function(error){
    console.log("Error adding document to Firestore: " + error);
  });

은 모음집을 만듭니다.EnglishWords은 문서 "문를가있것는고지서것▁a▁document▁has"가 있습니다.of 그서of에는 세 개의 하위 컬렉션이 있습니다.AudioSources으로 된 의 녹음), (미과영억된단어녹음로양으국국),녹ings음▁(단▁of▁(미▁in▁word어),FunFacts,그리고.Translations 컬렉션은 다음과 같습니다.Translations문서가 하나 .Spanish.Spanish문서에는 세 개의 키-값 쌍이 있으며, 'de'는 스페인어로 'of'를 번역한 것입니다.

의 첫 코의첫번줄컬만듭렉다니을션은드째를 .EnglishWords를 기다리고 있습니다..then그런 다음 세 개의 하위 컬렉션을 만듭니다. Promise.all세 개의 하위 컬렉션이 모두 설정된 시점을 알려줍니다.

IMHO, 저는 전체 어레이가 함께 업로드 및 다운로드될 때 Firestore의 어레이를 사용합니다. 즉, 개별 요소에 액세스할 필요가 없습니다.예를 들어, 'of'라는 단어의 문자 배열은 다음과 같습니다.['o', 'f']사용자는 "'of'의 철자를 어떻게 씁니까?"라고 물어볼 수 있습니다."'의 두 입니까?"라고입니다.라고 묻지 않을 것입니다.

문서와 같은 개별 요소에 액세스해야 할 때 컬렉션을 사용합니다. "Firebase Realtime Database"를 사용하여 .forEach내가 원하는 요소를 얻기 위해.였고, 및 저는, 앱 를 늦추고 있었습니다. 이는많또코은드였며으및심데층구이대적인조터규어모를레사이/는필여용하늦없요속의데엄양실를다습췄/행터다니도션를이케리하드이운로여플애난청는또▁this▁running▁my이,▁was는▁a▁i늦▁a심속실췄습행데다를니다도▁app션를이하케▁and리애플여드▁structure/▁andforEach대규모 어레이의 루프입니다.Firestore는 반복기를 데이터베이스 끝에 배치하여 단일 요소를 요청할 수 있도록 합니다. 그러면 해당 요소만 전송되므로 대역폭이 절약되고 앱이 더 빠르게 실행됩니다.컴퓨터에 광대역 연결이 있는 경우 웹 앱에서는 문제가 되지 않을 수 있지만 데이터 연결이 불량하고 장치 속도가 느린 모바일 앱에서는 중요합니다.

여기 내 파이어스토어의 사진 두 장이 있습니다.

enter image description here

문서에서:

컬렉션을 "작성"하거나 "삭제"할 필요는 없습니다.집합에서 첫 번째 문서를 작성한 후에는 집합이 존재합니다.컬렉션의 모든 문서를 삭제하면 더 이상 존재하지 않습니다.

여기서 저는 같은 문제에 직면했고 @Tomas David Kehoe의 대답으로 해결했습니다.

db.collection("First collection Name").doc("Id of the document").collection("Nested collection Name").add({
                //your data
            }).then((data) => {
                console.log(data.id);
                console.log("Document has added")
            }).catch((err) => {
                console.log(err)
            })

대답하기에는 너무 늦었지만, 여기 제게 효과가 있었던 것이 있습니다.

        mFirebaseDatabaseReference?.collection("conversations")?.add(Conversation("User1"))
            ?.addOnSuccessListener { documentReference ->
                Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.id)
                mFirebaseDatabaseReference?.collection("conversations")?.document(documentReference.id)?.collection("messages")?.add(Message(edtMessage?.text.toString()))
            }?.addOnFailureListener { e ->
                Log.w(TAG, "Error adding document", e)
            }

문서를 추가하기 위해 수신기를 추가하고 경로에 대해 Firebase 생성 ID를 사용합니다.추가할 새 컬렉션의 전체 경로에 이 ID를 사용합니다.I.E. - dbReference.collection('yourCollectionName')입니다.document(소방 기반 생성)ID).collection('사용자의 CollectionName').add(문서)POJO/객체)

알겠습니다. 그래서 최근 소방본부/소방본부 문서의 최신 업데이트를 고려할 때 비슷한 문제에 직면했습니다.

그리고 여기 저에게 효과적인 솔루션이 있습니다.

  const sendMessage = async () => {
    await setDoc(doc(db, COLLECTION_NAME, projectId, SUB_COLLECTION_NAME, nanoid()), {
      text:'this is a sample text',
      createdAt: serverTimestamp(),
      name: currentUser?.firstName + ' ' + currentUser?.lastName,
      photoUrl: currentUser?.photoUrl,
      userId: currentUser?.id,
    });
  }

유사한 예는 문서 https://firebase.google.com/docs/firestore/data-model#web-version-9_3 에서 찾을 수 있습니다.

채팅방

라이브 업데이트를 청취하려면 다음과 같은 방법을 사용할 수 있습니다.

const messagesRef = collection(db, COLLECTION_NAME, projectId, SUB_COLLECTION_NAME)
      
const liveUpdate = async () => {
        const queryObj = query(messagesRef, orderBy("createdAt"), limit(25));
        onSnapshot(queryObj, (querySnapshot) => {
          const msgArr: any = [];
          querySnapshot.forEach((doc) => {
            msgArr.push({ id: doc.id, ...doc.data() })
          });
          console.log(msgArr);
        });
      }

문서에 하위 컬렉션을 추가하는 별도의 방법은 없습니다.수집 방법 자체를 호출하면 됩니다.컬렉션이 있으면 참조하고 그렇지 않으면 새 컬렉션을 만듭니다.

dbRef.document("example").collection("subCollection")

언급URL : https://stackoverflow.com/questions/47514419/how-to-add-subcollection-to-a-document-in-firebase-cloud-firestore

반응형