【问题标题】:Firebase Collection Group Query on Id / Key [duplicate]Id / Key上的Firebase收集组查询[重复]
【发布时间】:2019-11-19 16:09:33
【问题描述】:

我一直在关注以下文档: https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

我的数据结构大致是这样的:

/teams/{teamid}
{
   displayName: "Company X Team",
   owner: "userid",
}

/teams/{teamid}/invites/{emailAddressAsKey}
{
    someProp: "my data"
}

在我的网络应用程序中,我想搜索所有不同的团队记录以找到一个邀请,该邀请的 id/key 等于我传入的电子邮件地址。阅读文档后,我认为集合组查询是什么我在找。但是,我的情况与示例不完全匹配。我想匹配键,而不是文档中的道具。我想我可以再次添加电子邮件地址作为道具,但这感觉不对。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    您必须将文档 ID 作为文档本身的键。目前没有其他解决方案。

    where 子句中使用FieldPath.documentId() 很诱人(例如,按照Alex Mamo 的回答https://stackoverflow.com/a/56967352/2518722),但这在一般情况下不起作用。原因是 FieldPath.documentId() 实际上是指文档的完整、唯一 ID,包括其路径。

    如果你这样做,你会得到以下错误:

    错误:查询集合组并按顺序排序时 FieldPath.documentId(),对应的值必须是有效的 文档路径,但 '' 不是因为它包含一个奇怪的 段数。

    基本上,where 子句仅适用于搜索键/值而不是文档 ID。

    【讨论】:

    • 这不是违背了查询的目的吗?如果我知道文档的完整路径,那么为什么我需要查询所有子集合呢?这感觉就像是 Firestore 方面的一个错误......
    • 嗯,是的,它并不完美!也许我误解了,但我不明白为什么这会破坏查询的目的?您不必将完整的文档路径作为值放入文档中 - 只需将您要搜索的特定内容。
    • 这更像是对 Firestore 不支持该用例的评论。我与支持团队和 Firebase 的成员进行了交谈,我们想出了最好的方法是将 ID 复制到对象本身的实际数据字段中。这样您就不必依赖FieldPath.documentId() 并且可以在id 上查询(在索引之后)。
    • 这应该是公认的答案。
    【解决方案2】:

    您可以在FieldPath.documentId() 的帮助下解决这个问题,例如以下代码行:

    db.collectionGroup('teams').where(firebase.firestore.FieldPath.documentId(), '==', 'teams/teamId').get()
    

    此查询将返回具有特定团队 ID 的所有文档。

    【讨论】:

    • 不会是:db.collectionGroup('invites').where(firebase.firestore.FieldPath.documentId(), '==', someEmailVar).get()
    • 是的。我正在尝试联系invites。至于我是否让它工作,还没有。我运行了查询,然后收到一个错误,抱怨“集合引用需要奇数个段”。我了解此错误与交替的集合/文档结构有关。但是,我不确定为什么会在这种情况下发生。也许这与使用电子邮件作为密钥有关。文档说你不应该有一个“。”在文档键中。但是,我已经看到几个关于 SO 建议使用电子邮件作为密钥的答案。
    • 此方法不起作用,因为FieldPath.documentId() 指的是整个、完全限定的路径。已在下面发布答案。
    • 正如@HughHughTeotl 提到的,这行不通。让它工作的方法是提供一个完全限定的 ID 路径(例如firebase.firestore.FieldPath.documentId(), '==', 'teams/teamId'),这违背了集合组查询的目的。最好将 id 包含在文档的属性中,以便正确完成查询。
    • @JohnnyOshika 是的,你是对的。我刚刚更新了我的答案。谢谢你,约翰尼。
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多