【问题标题】:How to get a Subcollection inside a Collection in Firestore Web Version 9 (Modular)?如何在 Firestore Web 版本 9(模块化)的集合中获取子集合?
【发布时间】:2021-11-16 01:56:16
【问题描述】:

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

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

    return alunoHistorico;
  }

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

// 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!");
}

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

const docRef = doc(db, "collection_name", "doc_name", "subcollection_name");

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

const docRef = doc(db, "collection_name", "doc_name", "subcollection_name", "sub_doc");

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

感谢所有抽出时间的人。

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    您需要使用collection() 来获取CollectionReference 而不是返回DocumentReferencedoc()

    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()})))
    

    我在这里写了一个关于doc()collection()V8V9)区别的详细答案:

    Firestore: What's the pattern for adding new data in Web v9?

    【讨论】:

    • 工作得很好,非常感谢。对于不知道如何获取数据的任何人,我使用 getDocs() 检索它,如文档中所示,如下所示: const querySnapshot = await getDocs(collection(db, "collections", "doc_name", "subcollection ")); querySnapshot.forEach((doc) => { // doc.data() 永远不会为查询文档快照未定义 console.log(doc.id, " => ", doc.data()); });再次感谢@Dharmaraj
    • 不客气@KleberGermano。我应该在回答中提到getDocs()。谢谢:D
    • 在我的情况下,我需要一个查询我如何传递它
    • @PatrickWaweru 最好发布一个包含数据库结构的新问题并解释需要运行的查询。
    • @Dharmaraj 我明白了,感谢您的帮助
    【解决方案2】:

    如果有人想在 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());
        });
      });
    

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 2021-01-15
      • 2019-02-17
      • 2021-03-04
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多