Firestore:获取在哪里找到的文档的子集合

Posted

技术标签:

【中文标题】Firestore:获取在哪里找到的文档的子集合【英文标题】:Firestore: Get subcollection of document found with where 【发布时间】:2018-05-18 00:13:54 【问题描述】:

我正在尝试获取子集合中的文档,该子集合是使用 .where 函数找到的文档的一部分

例子:

RootColl/ 文档 A/ 子项 1 文档 1 文档 2 文档 3 子科尔 2 文档 文档 A/ 子项 1 文档 1 文档 2 文档 3 子科尔 2 文档

我想从字段级别 == 1 的文档中获取SubColl 1 下的所有文档

我正在尝试这样做:

db.collection("RootColl").where("field", "==", "1").collection("SubColl 1").get()

但是这样做我得到了错误

未捕获的类型错误:db.collection(...).where(...).collection 不是函数

编辑 1: 按照 Frank van Puffelen 的建议,我得到了同样的错误,“收集”不是函数

Current Code Error

【问题讨论】:

【参考方案1】:

子集合位于特定文档下。您现在共享的查询指向多个文档。您需要执行查询以确定它指向哪些文档,然后循环遍历结果,并获取每个文档的子集合。

在代码中:

var query = db.collection("RootColl").where("field", "==", "1");
query.get().then((querySnapshot) => 
  querySnapshot.forEach((document) => 
    document.ref.collection("SubColl 1").get().then((querySnapshot) => 
      ...
    );
  );
);

【讨论】:

我得到同样的错误:document.collection is not a function document.collection is not a function 感谢您发现这个错误。您需要从document 获取ref 才能访问子集合。我修复了答案中的代码。 谢谢@FrankvanPuffelen,是否有计划编写指南或文档如何使用网络上的子集合?当前文档仅声明“网络不支持子集合”。【参考方案2】:

使用 Firebase 版本 9(2021 年 9 月更新):

如果 subcollection(subcoll) 包含 3 个文档(doc1, doc2, doc3),如下所示:

coll > doc > subcoll > doc1 > field1: "value1", field2: "value2"
                       doc2 > 字段 1:“值 1”,字段 2:“值 2”
                       doc3 > 字段 1:“v1”,字段 2:“v2”

您可以通过下面的while获得2个文档(doc1,doc2)的子集合(subcoll)

import  query, collection, where, getDocs  from "firebase/firestore";

const q = query(collection(db, "coll/doc/subcoll"), 
                where("field1", "==", "value1"));
    
const docsSnap = await getDocs(q);

docsSnap.forEach((doc) => 
  console.log(doc.data()); // "doc1" and "doc2"
);

没有forEach()方法来获取2个文档(doc1, doc2)的子集合(subcoll)while如下:

import  query, collection, where, getDocs  from "firebase/firestore";

const q = query(collection(db, "coll/doc/subcoll"),
                where("field1", "==", "value1"));
    
const docsSnap = await getDocs(q);
    
console.log(docsSnap.docs[0].data()); // "doc1"
console.log(docsSnap.docs[1].data()); // "doc2"

另外,您可以使用以下代码获取子集合(subcoll)的所有3个文档(doc1,doc2,doc3)

import  getDocs, collection  from "firebase/firestore";

const docsSnap = await getDocs(collection(db,"coll/doc/subcoll"));
      
docsSnap.forEach((doc) => 
  console.log(doc.data()); // "doc1", "doc2" and "doc3"
);

没有forEach()方法获取子集合(subcoll)全部3个文档(doc1, doc2, doc3)

import  getDocs, collection  from "firebase/firestore";

const docsSnap = await getDocs(collection(db, "coll/doc/subcoll"));
        
console.log(docsSnap.docs[0].data()); // "doc1"
console.log(docsSnap.docs[1].data()); // "doc2"
console.log(docsSnap.docs[2].data()); // "doc3"

同样,另外,您可以仅使用以下代码获取子集合(subcoll)的一个特定文档(doc3)

import  getDoc, doc  from "firebase/firestore";

const docSnap = await getDoc(doc(db, "coll/doc/subcoll/doc3"));
          
console.log(docSnap.data()); // "doc3"

【讨论】:

谢谢。使用模块化 SDK 很难找到答案。【参考方案3】:

如果您在主集合和子集合中有多个文档,则使用此代码:

数据结构: 用户(集合)-->用户1(文档)-->组(集合)-->数据(文档) users(collection)-->>user2(doc)-->group(collection)-->data(doc)

const mainRef = collection(db, "users"); //users is my main collection, containing all the users 
const users = await getDocs(mainRef); //Getting all the users
users.forEach(async (user) =>  // loop through each user so that we got id for each document(user) to get sub collection data
  let userCollectionRef = collection(db, `users/$user.id/groups`); //groups is my sub-collection name
  const GroupDoc = await getDocs(userCollectionRef); //getting all docs for particular user in sub-collection(groups)
  GroupDoc.forEach((item) => console.log(item.data())); // loop through each document in group for each user so that we got nested data 
);

【讨论】:

以上是关于Firestore:获取在哪里找到的文档的子集合的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 获取根集合的所有文档和子集合

如何在 Firestore 中获取生成的文档 ID,然后将子集合添加到其中?

来自特定文档 Firestore 安全性的通配符子集合

如何在保持访问权限不变的同时将 Firestore 文档从一个子集合共享到另一个子集合?

Firestore:获取带有和不带有子集合数据的集合[重复]

在 Firestore 中使用 AngularFire 列出文档的子集合