2020 年 1 月 23 日更新:
有关这方面的更新,请参阅小组板上与 Sam Stern 的对话:https://groups.google.com/d/msgid/google-cloud-firestore-discuss/e1b47358-b106-43a0-91fb-83c97d6244de%40googlegroups.com
大部分讨论来自一个明显的事实,即数据库中的所有记录都有一个基于文档的完全合格路径的单一“主索引”(因此只需要在“集合内”是唯一的)。
为了“加速”文档引用,JS SDK 实际上将集合路径“预置”到 .doc 中传递的任何信息上,以“方便地”使用该主索引
即所有这些都是完全等价的
db.doc('collection/docId/collection/docId/collection/docId")
db.collection('collection").doc("docId/collection/docId/collection/docId")
db.collection('collection").doc("docId").collection("collection").doc("docId/collection/docId")
db.collection('collection").doc("docId").collection("collection").doc("docId").collection("collection").doc("docId")
db.doc("collection/docId").collection("collection").doc("docId").collection("collection").doc("docId")
db.collection("collection/docId/collection").doc("docId").collection("collection").doc("docId")
db.doc("collection/docId/collection/docId").collection("collection").doc("docId")
db.collection("collection/docId/collection/docId/collection").doc("docId")
--- 他们都创建了相同的索引引用“collection/docId/collection/docId/collection/docId”以在“主索引”中查找文档。
(在我一点也不谦虚的观点中)FieldPath.documentId() 被实现(错误地)以“方便地”匹配此行为,因此需要完全限定的路径,而不是 docId,当它 应该像任何其他查询一样实现,并且需要创建和维护一个新索引以适应查询。
此行为的代码是在实现 collectionGroups 之前编写的 - 并且从未记录使用的 hack 与使用的 METHOD NAME 不匹配。
解决方法是要求 Coder 将 docId 作为字段复制到每个文档中,然后在上面写下您的查询。我已经在 Firestore.js 和我的应用程序之间编写了自己的层来抽象行为,并且可能会简单地将其实现为库的基本功能。
但这显然是一个错误,到目前为止,每个人都一直试图告诉我这是有道理的,他们会更改文档以匹配现有行为(但不是方法名称)。
正如我之前所写的,我不断收到一堆破烂的雏菊,并被告知“看到了吗?这些是玫瑰!文档称它们为玫瑰!任何其他名字的玫瑰闻起来都一样甜,等等!! "
除非他们感到尴尬,否则不会有任何更新
2020-01-10 更新:我已经构建了一个演示应用程序,显示了确切的错误,并已按要求将其发送给 Firebase 支持。出于某种原因,支持者认为这是一个“功能请求”,尽管它显然是一个错误。当以“/ShowInfo/showID”形式调用 URL 时,App 匿名登录 Firebase Auth;然后使用 FieldPath.documentId() "==" showID
调用对 collectionGroup 的查询(3 级深)
它以 3 种方式进行查询:
1) 一次只有 showID- 失败并出现熟悉的“无效查询。当通过 FieldPath.documentId() 查询集合组时,提供的值必须导致有效的文档路径,但 'pqIPV5I7UWne9QjQMm72'(实际showID) 不是因为它有奇数个段 (1)。”
2) 一次使用“相对路径”(/Shows/showID),没有错误,但不返回任何文档。
3) 最后是“完整路径”(/Artists/ArtistID/Tour/tourID/Shows/showID)。这没有错误,确实返回一个文档 - 但如果我有完整路径,为什么我需要对 collectionGroup 的查询?而且我没有完整路径 - showID(上图)作为 URL 的一部分出现(显然是节目数据的链接) - 我为测试手工伪造了它。
等待响应。
2019 年 12 月 2 日更新:Firebase 支持人员向我询问我是否仍希望解决此问题。呵呵。
2019 年 9 月 27 日更新:Firebase 支持人员承认这是一个错误。没有关于何时修复的消息。 documentId() 应该,确实,能够直接用于仅文档 ID。
documentID 可以 用作查询的一部分,但正如上面@greg-ennis 所指出的,它需要偶数个段。事实证明,如果您确实需要一个 collectionGroup(我需要),那么要比较的“Id”需要冗余将 collectionGroup ID/名称添加为一个段:
db.collectionGroup('likedBy')
.where(firebase.firestore.FieldPath.documentId(), '==', "likedBy" + "/" + "User A")
.get();
我已经使用它并且它 (*sorta) 有效。 (诚然,我花了 2 个小时才弄明白,上面的问题有助于集中搜索)
另一方面,this 特定情况是不是您要使用collectionGroup 的地方。记住集合组是 - 一种引用一组独立集合 的方式,就好像它们是一个集合一样。在这种情况下,保存“用户 A”喜欢的“集合”作为“用户 A”文档下的集合存在。只需在删除“用户 A”的文档之前删除 那个 单个集合。不需要把其他人的喜欢都带进去。
排序:被比较的字段路径显然必须是文档的完整路径。如果您知道 documentId,但由于“原因”,您不知道 完整路径,包括子集合属于哪个文档(有点你使用的原因首先是 collectionGroup 方法),现在这似乎是一条死胡同。继续努力。
已提交的已验证和错误报告:FieldPath.documentID() 不 与 documentId 进行比较;它与完全分段的文档路径进行比较,就像您必须提供给 .doc(path) 一样:
即:在“TopCollection/document_this/NextCollection/document_that/Travesty/document_Id_I_want”中查找文档
使用 collectionGroup "Travesty"
db.collectionGroup("Travesty")
.where(firebase.firestore.FieldPath.documentId(), '==', "document_id_I_want")
...会失败,但是...
db.collectionGroup("Travesty")
.where(firebase.firestore.FieldPath.documentId(), '==', "TopCollection/document_this/NextCollection/document_that/Travesty/document_Id_I_want")
.get()
...将成功。这使得这毫无用处,因为如果我们拥有所有 信息,我们将只使用:
db.doc("TopCollection/document_this/NextCollection/document_that/Travesty/document_Id_I_want")
.get()