如何在 Firestore Web 版本 9(模块化)中获取集合内的子集合?

Kle*_*ano 14 javascript firebase google-cloud-firestore

我正在使用 Firestore Web 8 的链接模式,但我无法将其更新到模块 9,并且很难弄清楚如何获取我的子集合(我的集合中的集合)的所有内容。
我的旧功能是这样的并且工作正常:

function getInfo(doc_name) {
    let infoDB = db
      .collection("collection_name")
      .doc(doc_name)
      .collection("subcollection_name")
      .get();

    return alunoHistorico;
  }
Run Code Online (Sandbox Code Playgroud)

所以用模块方式我尝试了这段代码

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

const docRef = doc(db, "collection_name", "doc_name");
const docSnap = await getDoc(docRef);

if (docSnap.exists()) {
  console.log("Document data:", docSnap.data());
} else {
  // doc.data() will be undefined in this case
  console.log("No such document!");
}
Run Code Online (Sandbox Code Playgroud)

但是函数 doc() 需要一个偶数参数(不包括 db 参数),所以如果我尝试使用像这样的 3 个参数,我会收到一个错误:

const docRef = doc(db, "collection_name", "doc_name", "subcollection_name");
Run Code Online (Sandbox Code Playgroud)

为了让它工作,我必须传递子集合中的确切文档

const docRef = doc(db, "collection_name", "doc_name", "subcollection_name", "sub_doc");
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用,因为我在子集合中有一个操作系统文档列表,我想要检索它。那么如何才能将所有文档放入我的子集合中呢?

感谢任何花时间的人。

Dha*_*raj 24

您需要使用collection()get aCollectionReference而不是doc()return a DocumentReference

const subColRef = collection(db, "collection_name", "doc_name", "subcollection_name");
// odd number of path segments to get a CollectionReference

// equivalent to:
// .collection("collection_name/doc_name/subcollection_name") in v8

// use getDocs() instead of getDoc() to fetch the collection

const qSnap = getDocs(subColRef)
console.log(qSnap.docs.map(d => ({id: d.id, ...d.data()})))
Run Code Online (Sandbox Code Playgroud)

doc()我在这里写了关于and collection()(in V8and )之间差异的详细答案V9

Firestore:在 Web v9 中添加新数据的模式是什么?


小智 9

如果有人想使用 Modular Firebase V9 中的 onSnapshot 获取子集合内文档的实时更新,您可以通过以下方式实现:

import { db } from "./firebase";
import { onSnapshot, collection } from "@firebase/firestore";

let collectionRef = collection(db, "main_collection_id", "doc_id", "sub_collection_id");

  onSnapshot(collectionRef, (querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log("Id: ", doc.id, "Data: ", doc.data());
    });
  });
Run Code Online (Sandbox Code Playgroud)