当前位置: 首页 > 知识库问答 >
问题:

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

尹雅健
2023-03-14

假设我有这种结构

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

其中AB是集合,AB是文档
有没有一种方法可以通过一个查询获得根文档中包含的所有内容<如果我这样问

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

我只得到名称:'Tim'字段。我想要的是B的所有文件
我基本上希望我的查询返回

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

是否可能或者我真的需要对每个集合进行多个查询:/?

假设我有一个代表用户配置文件的非常深的嵌套集合树,我的成本会像地狱一样上升,因为每次我加载用户配置文件时,我都有一个读取请求的乘数1 x N其中N是我的树的深度: /.

共有3个答案

朱鹤轩
2023-03-14

添加到Matt R答案中,如果你使用babel或者你可以使用async/wait,你可以用更少的代码得到相同的结果(没有捕获/然后):

// 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);
    })
});
苏鸿波
2023-03-14

众所周知,默认情况下,云火中的查询很浅。这种类型的查询不受支持,尽管谷歌将来可能会考虑这种查询。

屠晟睿
2023-03-14

如果您担心每次拉取的成本,那么您需要根据您的常见视图/拉取需求来构建数据,而不是根据您可能更喜欢的完美结构来构建数据。如果你需要每次把这些东西拉在一起,考虑使用“地图”来处理那些实际上不需要是文档的子集合。

在本例中,“首选项”是一个地图。

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

每个文档的大小也被限制在1MB——因此,如果您需要为该用户存储一些可以扩展并继续增长的内容,比如日志记录,那么将日志分解为一个子集合是有意义的,只有在您需要时才会被提取,使每个日志条目成为一个单独的文档。。。所有用户的所有日志是存储在单独的父集合中,还是存储在每个用户的子集合中,这实际上取决于您将如何提取日志,以及如何实现快速的速度,并与提取成本相平衡。如果你向这个用户展示他们最近的10次搜索,那么搜索日志作为一个子集合是很有意义的。如果要提取所有用户的所有搜索数据进行分析,那么单独的父级收集是有意义的,因为您可以在一次提取中提取所有日志,以防止需要分别从每个用户提取日志。

为了方便起见,你也可以把你的拉和promise嵌套在一起。

  // 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);
  });
 类似资料:
  • 我正在使用Java开发一个Android应用程序,我使用firestore数据库,我有一个名为用户位置的集合,其结构类似于照片: 分贝 我的问题是,当一个用户改变他的位置或一个新用户进入一个已经存在的位置(其他用户有相同的位置)时,它会创建一个新文档(如在“oran, algerie”中)。当我添加新用户并更新文档时,我想使用,但问题是我无法以正常方式检索根集合的所有文档: 它返回null。我尝试

  • 我现在有一个firestore,看起来像这样: 我使用的是,我试图获取“报告”集合中的所有文档。 我可以得到一个报告: 但我无法得到整个子集合 这可能吗?我是新手,所以这可能是一个愚蠢的问题。 谢谢 编辑控制台中收到的错误消息是: 我不确定权限,我没有访问权限,但如果是权限问题,我很困惑,我可以从集合中获取一个文档,但找不到获取所有文档的方法

  • 我在我的FiRecovery数据库中查询子集合内的所有文档时遇到困难。(我使用的是Node.js) 我的目标是从名为 我看了看留档https://firebase.google.com/docs/firestore/query-data/get-data但没有任何结果如何解决问题。 我现在的问题是这样的: 但是我得到了

  • 使用go和FireStore创建web应用程序。我遇到了一个奇怪的问题。如果使用NewDoc方法保存数据 我可以使用 现在,当我只想查找博客集合中的所有文档时,这是很棒的。但是我遇到了无法从blogs集合中查询特定blog的问题。我通过查看文档和保存类似的帖子来解决这个问题。 但是,由于我自己创建了docID,所以从整个集合中检索所有文档时使用

  • 据我所知,我可以使用云函数以某种方式实现这一点?我试着阅读云函数,但我很迷路。是否有一种方法可以触发云函数,在用户更新帖子时删除子集合中的所有文档?

  • 我试图设置一个聊天应用程序,在其中你可以搜索随机的用户交谈。现在,firestore中的数据库结构如下: 集合“users”-文档“userid”-集合“conversations”-文档“conversationid”-字段“partner”,“lastmessage” 其次,我有一个集合“conversations”,其中包含对话中的所有消息。 我现在尝试做的是,当你按下一个按钮时,应用程序将