【问题标题】:Firestore query document where object key exists存在对象键的 Firestore 查询文档
【发布时间】:2019-01-09 03:51:01
【问题描述】:

我正在编写一个跟踪事件的应用程序。我正在使用 firestore 来拥有 events 的主要集合,其中包含每个事件作为文档。每个文档都有自己的详细信息(包括roles 对象)和事件中自己的步骤集合。

集合对象如下所示:

events > [collection]
    eventid1 > [doc]
        steps > [collection]
        location: "Even Center",
        notes: "Some notes here",
        timestamp: 1272153600,
        title: "A great event",
        roles:
            userID1: 0, //numbers to define role type
            userID2: 1,
            userID3: 1,

我想要做的是查询roles.userID1 存在的任何事件。我知道 firestore 没有子集合查询,所以这是我最接近解决这个问题的方法。

只有 3 个“角色”(0 = 所有者,1 = 编辑,2 = 查看者)。我尝试编写三个查询并使用.where("roles." + this.user.uid, "==", 0) 组合查询。这会起作用(尽管事后我遇到了一些数组问题),但我不想让每个查看此内容的用户拨打 3 次电话。

我在某处随机评论中看到您可以使用查询.where("roles." + this.user.uid, "<", ""),但这对我不起作用。

有没有办法编写一个查询来查看对象中的键是否存在?

【问题讨论】:

  • 哇...一遍又一遍地阅读我的问题后,我意识到我通过使用数字作为角色完美地设置了自己。我现在使用查询.where("roles." + this.user.uid, "<", 3)。查找用户 ID 存在且具有角色的任何事件

标签: google-cloud-firestore


【解决方案1】:

正如我上面所说的,我能够回答自己的问题是因为我不小心为成功做好了准备。

一开始,我决定给我的角色一个数字值,而不是一个字符串值。 0, 1 和 2。现在看到了,我意识到我可以通过使用< 3 有效地使用.where 子句。

我的查询现在包括.where("roles." + this.user.uid, "<", 3)

这有效地查看了角色的子对象(整个字符串类似于.where("roles.ehHH-scSd-d222-njsl-LLewS, "<", 3)。(3 不是角色,所以如果您有超过 3 个角色,请增加数字)。

【讨论】:

  • 我有相同的文档结构,并以相同的方式查询文档,稍有不同,因为我使用字符串角色:.where(`users.${this.$currentUser.id}`, '>', ''),但我无法为list 操作制定安全规则,仅适用于get 操作。您是否能够编写安全规则?
猜你喜欢
  • 1970-01-01
  • 2020-07-09
  • 2019-06-23
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多