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

查询集合中的所有文档,以及firestore中的所有子集合

孙震博
2023-03-14

我正在使用Firebase Firestore作为BaaS构建一个应用程序。

但当我尝试在我的应用程序上创建提要/实现全文搜索时,我面临一个问题。

我希望能够搜索所有用户的帖子,问题是,用户帖子在Firestore数据库中的结构如下:

帖子(收藏)-

我想遍历每个用户的用户帖子子集合并获取提要的所有数据,并使用Algolia或ES等全文搜索应用程序来实现它。

>

  • 我可以遍历特定的用户ID(代码如下),但作为初学者,我找不到遍历所有用户ID并获取所有用户ID的方法。

      firebase.firestore()
              .collection('allPosts')
              .doc('SPECIFIC_USER_ID') //-> Here I have to loop through all docs in that collection
              .collection('userPosts')
              .orderBy("creation", "asc")
              .get()
              .then((snapshot) => {
                  let posts = snapshot.docs.map(doc => {
                      const data = doc.data();
                      const id = doc.id;
                      return { id, ...data }
                  })
                  setUserPosts(posts)
              })
      }
    

    会喜欢一些帮助!

  • 共有1个答案

    裴成文
    2023-03-14

    集合组查询

    您可以使用集合组查询在所有名为X的集合中进行查询。

    var posts= db.collectionGroup('userPosts').orderBy('creation').limit(10);
    posts.get().then((querySnapshot) => {
                  let posts = querySnapshot.map(doc => {
                      const data = doc.data();
                      const id = doc.id;
                      return { id, ...data }
                  })
                  setUserPosts(posts)
    });
    
    

    来源:https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

    阿尔及利亚实施

    您需要使用云函数将字段迁移到专用于Algolia的集合中。许多用户发现嵌套子集合在Algolia的设置中存在问题。您可以通过将用户Post数据作为“源”复制到这个新的公共集合,并使用Firebase Algolia扩展直接同步它来实现这一点

    exports.bakePosts= functions.firestore
        .document('allPosts/{userID}/userPosts/{postID}')
        .onWrite((change, context) => {
          // Get an object with the current document value.
          // If the document does not exist, it has been deleted.
          const document = change.after.exists ? change.after.data() : null;
    
          // Get an object with the previous document value (for update or delete)
          const oldDocument = change.before.data();
          if(document != null)
              db.collection("posts/"+ context.params.postID).set(document);
          if(document == null)
              db.collection("posts/"+ context.params.postID).delete();
        });
    

    Algolia扩展:https://firebase.google.com/products/extensions/firestore-algolia-search

    如果只需将帖子提交到主集合,并将userID作为文档中的“所有者”属性,就可以避免上述大部分内容。上述内容也有好处,但更多的是与博客帖子相关,在博客帖子中,用户可能有“正在工作”版本而不是Live。

    Algolia扩展有关于如何设置它的完整指南,如果您需要自定义扩展,也可以使用源代码。

     类似资料:
    • 我在Cloud Firestore中有以下简化的数据模式: 我现在想向用户展示他团队的所有“待办事项”文档,我不知道什么是最好的方法。 1. 集合组查询 - 按团队 ID 查询 为此需要两个查询。每个待办事项文档都可以具有父团队 ID,并通过集合组查询进行检索,例如 - 到目前为止,这对我来说似乎是最好的解决方案,但缺点是“IN”查询限制为10个值 https://firebase.googleb

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

    • 问题内容: 我正在寻找清除整个收藏夹的方法。我看到有一个批处理更新选项,但这需要我知道集合中的所有文档ID。 我正在寻找一种简单地删除集合中每个文档的方法。 谢谢! 编辑:下面的答案是正确的,我使用以下方法: 问题答案: 没有API可以一次性删除整个集合(或其内容)。 从Firestore文档中: 要在Cloud Firestore中删除整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。

    • 假设我有这种结构 其中和是集合,和是文档 有没有一种方法可以通过一个查询获得根文档中包含的所有内容<如果我这样问 我只得到字段。我想要的是B的所有文件 我基本上希望我的查询返回 是否可能或者我真的需要对每个集合进行多个查询:/? 假设我有一个代表用户配置文件的非常深的嵌套集合树,我的成本会像地狱一样上升,因为每次我加载用户配置文件时,我都有一个读取请求的乘数其中N是我的树的深度: /.

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

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