Firestore查询已删除文档上的子集合

时间:2019-01-21 10:06:55

标签: firebase google-cloud-firestore firebase-console

使用Firebase控制台时,可以查看所有文档和集合,甚至是路径中不存在“文档”的子集合。

这在此处包括的图片中以及在文档和屏幕截图中均已说明。这些文档不会出现在查询或快照中。那么,当查询未返回嵌套的子集合时,控制台如何找到它们呢? Picture showing the Firebase console

是否可以以某种方式列出这些文档。由于控制台可以做到,因此似乎必须有一种方法。 并且,如果可以找到这些文档,是否可以创建一个查询来获取所有不存在但仅限于具有嵌套子集合的文档的查询? (因为所有不存在的文档的集合都是无限的)

2 个答案:

答案 0 :(得分:4)

Admin SDK提供了一个listDocuments方法,其描述如下:

  

返回的文档参考可能包括对“缺少   文档”,即没有文档但存在的文档位置   其中包含带有文档的子集合。试图阅读这样的   文档引用(例如,通过.get()或.onSnapshot())将返回一个   .exists属性为false的DocumentSnapshot。

将此与example for listing subcollections结合使用,您可以执行以下操作:

// Admin SDK only
let collectionRef = firestore.collection('col');

return collectionRef.listDocuments().then(documentRefs => {
   return firestore.getAll(documentRefs);
}).then(documentSnapshots => {
   documentSnapshots.forEach(doc => {
      if( !doc.exists ) {
        console.log(`Found missing document: ${documentSnapshot.id}, getting subcollections`);
        doc.getCollections().then(collections => {
          collections.forEach(collection => {
            console.log('Found subcollection with id:', collection.id);
          });
        });
      }
   });
});

请注意,Firebase CLI使用不同的方法。通过REST API,它可以查询给定路径下的所有文档,而无需先知道其特定位置。您可以在递归删除代码here中看到它的工作原理。

答案 1 :(得分:1)

  

是否可以创建一个查询,以获取嵌套在不存在的文档下的所有这些子集合。

Firestore中的查询很浅,这意味着它们仅从查询所针对的集合中获取项目。 Cloud Firestore无法在单个查询中从顶级集合和其他集合或子集合中获取文档。 Firestore不一次性支持跨不同集合的查询。单个查询只能使用单个集合或子集合中的文档属性。

因此,就您而言,即使一个文档不存在(不包含任何属性),您仍然可以查询位于其下的集合。换句话说,您可以查询queue文档中存在的-LFNX ... 7UjS子集合,但是不能查询所有文档中的所有queue子集合。您一次只能查询一个子集合。

编辑:

根据您的评论:

  

我想找到嵌套在不存在的文档下的集合。

无法找到 s 的集合,因为您无法查询不同的集合。您可以查询一个。我能想到的最简单的解决方案是检查items集合中的文档是否不存在(没有属性),然后创建查询(items -> documentId -> queue),并检查是否有任何结果。

编辑2:

Firebase控制台通过斜体中显示的那些文档ID告诉您,这些文档只是存在。这些文档不存在,因为您根本没有创建它们。您所做的只是在文档中创建的子集合,而该子集合最初并不存在。换句话说,它只是“保留”该集合中文档的ID,然后在其下创建一个子集合。通常,您应该只创建实际上确实存在存在的文档子集合,但这就是文档不存在时的样子。

在Cloud Firestore中,文档和子集合不能像您使用的文件系统文件和目录那样工作。如果在文档下创建子集合,则不会隐式创建任何父文档。子集合不以任何方式绑定到父文档。换句话说,该位置没有物理文档,但该位置下还有其他数据。

在Firebase控制台中,那些文档ID会被显示,因此您可以向下浏览树并获取其下的子集合和文档。但与此同时,控制台会通过在斜体中显示其ID来警告您这些文档不存在。因此,由于下面没有数据这一简单事实,您无法显示或使用它们。如果要更正此问题,则必须至少编写一个可以容纳值的属性。这样,这些文档将保存一些数据,因此您可以做任何您想做的事情。

P.S。在Cloud Firestore中,如果删除文档,则其子集合将继续存在,这是由于与我上面提到的完全相同的原因。