【问题标题】:Firestore get documents where value not in array?Firestore获取值不在数组中的文档?
【发布时间】:2019-02-04 17:45:35
【问题描述】:

有没有办法获取数组字段不包含一个或多个值的所有文档,现在有“array-contains”但有类似“array-not-contains”的东西吗?

【问题讨论】:

  • 尝试数组包含“”。
  • @JeffPadgett 这将返回其数组字段包含空字符串值的所有文档。这在这里行不通。
  • 我的错误,误读了问题。

标签: firebase google-cloud-firestore


【解决方案1】:

我认为目前不可能。我会尝试查看这篇博文以供参考。

better arrays in cloud firestore

您可能需要将数组转换为对象,以便通过 (property === false) 进行查询

【讨论】:

  • 如果该属性不存在,即使使用property === false查询也不会给出结果
  • 这将起作用,除非您的数组中的元素是动态的且具有任意值,然后如果您对多个字段进行查询,这将由于索引问题而失败
【解决方案2】:

您只能根据索引查询 Firestore,这样所有查询都可以扩展到搜索数十亿个文档而不会出现性能问题。

索引通过记录数据集中存在的值来工作。如果索引跟踪不存在的事物,它就不可能高效。这是因为与您的数据集相比,不存在的值的范围非常大,因此无法索引。查询某个值是否不存在需要扫描您的所有文档,而这无法扩展。

【讨论】:

  • 我理解你的说法,但这也意味着有些事情是不可能的。例如,如何向用户显示他还没有看到的用户列表?像 Tinder 一样,您向人们展示您尚未“匹配”的人,并存储您匹配或忽略的人,但您无法保留所有未匹配的人的记录(并制作索引)。即使用户相对较少(超过 1 万),您也已经拥有超过十亿条记录。我不知道我所说的是否有道理,但我没有找到在 Firebase 中表示这种关系的方法。
  • 如果您想记录尚未执行的操作,只需在创建文档时指定一个已知值来指示它,以便它被索引。例如hasDoneSomething = false 然后,当采取行动时,将其设置为 true。您必须提前知道要索引的内容。
  • 亲爱的,您能详细说明一下您在这里所代表的主张吗? hasDoneSomething = false接近
【解决方案3】:

考虑到您的集合中的文档数量较少,您可以使用 onCreate 云函数触发器将它们的所有 id 存储在另一个文档中,从客户端下载此文档并在客户端执行过滤。如果您担心性能,也可以在云函数中完成所有这些操作。

您将有 1 次额外读取,但这没什么大不了的,每个文档最多可以有 1 MB 的存储空间,这很多,所以您不必太担心,您也可以将这些 id 划分为不同的如果文件太大,则将它们合并到客户端/云功能上。

这对于小型数据集非常有效,但如果您期望数百万个文档,那么您无能为力。

【讨论】:

    【解决方案4】:

    Firestore 最近增加了对a not-in clause 的支持。

    citiesRef.where('country', 'not-in', ['USA', 'Japan']);

    这将获取存在country 并且具有除“USA”、“Japan”或“null”之外的值的每个文档。

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 2020-12-03
      • 2021-07-25
      • 1970-01-01
      • 2023-02-25
      • 2021-06-29
      相关资源
      最近更新 更多