在 Firestore 查询中实现 OR - Firebase firestore

Posted

技术标签:

【中文标题】在 Firestore 查询中实现 OR - Firebase firestore【英文标题】:Implementing OR in firestore query - Firebase firestore 【发布时间】:2018-04-11 14:34:49 【问题描述】:

我正在尝试在 firestore 查询中实现逻辑 OR 运算符。

db.collection('users').where('company_id', '==', companyId)
                          .where('role', '==', 'Maker')
                          .where('role', '==', 'Checker')
                          .where('role', '==', 'Approver')
                          .get().then(function(adminsSnapshot)


             //Some processing on dataSnapshot
)

但这不是实现 OR 的正确方法。

我希望所有具有“制造者、检查者或批准者”角色的用户。

我将如何在 firestore 查询中实现 OR? Doc中什么都没有。

【问题讨论】:

默认角色是什么? 两年后,这已经成为可能。请参阅我的更新答案。 【参考方案1】:

编辑(2019 年 11 月) Cloud Firestore 现在支持“IN”查询 (announcement),它允许您执行一种 OR 查询来查找具有同一字段中的几个值之一的文档。

例如上面的查询:

db.collection('users')
  .where('company_id', '==', companyId)
  .where('role', 'in', ['Maker', 'Checker', 'Approver']);

原答案

Cloud Firestore 中没有“OR”查询。如果您想在单个查询中实现此目的,您将需要一个像 maker_or_checker_or_approver: true 这样的字段。

当然,您始终可以执行三个查询并将它们加入客户端。

【讨论】:

我正在做 3 个查询。这就是我正在做的事情。是的 所以,如果我说类似 twitter 的话,我只想看到我关注的人的推文,我不能说 tweets.where(user == john OR lisa OR julia) 大家好。节点 SDK 是否有任何更新?多个查询似乎仍然是过滤多个字段的低效方式! 您可以在此处跟踪 OR 功能的进度:issuetracker.google.com/issues/129070817【参考方案2】:

现在,Firestore 中新增了对 inarray-contains-any 运算符的支持,这使得这成为可能,这允许在单个查询中查询多达 10 个值。

https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html

因此,使用您的示例,查询看起来像这样。

db.collection('users')
    .where('company_id', '==', companyId)
    .where('role', 'in', ['Maker', 'Checker', 'Approver']);

在上面的示例中,如果您的数据存储在数组中,请用 in 替换 array-contains-any

【讨论】:

我正在尝试使用您的查询,但收到错误“Invalid value “in”提供给函数 Query.where() 的第二个参数。可接受的值:= , >, 数组包含”。请帮助我如何解决此错误 它可能尚未在您正在使用的客户端库中实现。最后我检查了一下,它只在最新版本的 NodeJS 和 Python SDK 中实现。随着时间的推移,它可能会推广到更多的客户端库。【参考方案3】:

您可以使用 rxjs 组合 observables,参见下面的 angular(6) 示例;

orQuery()

    const $one = this.afs.collection("users", ref => ref.where("company_id","==","companyId")).valueChanges();
    const $two = this.afs.collection("users", ref => ref.where("role","==","Maker")).valueChanges();

    return combineLatest($one,$two).pipe(
        map(([one, two]) => [...one, ...two])
    )


getOr()
    this.orQuery().subscribe(data => console.log(data))

【讨论】:

或...const combinedList = combineLatest<any[]>(fooPosts, barPosts).pipe( map(arr => arr.reduce((acc, cur) => acc.concat(cur)))) 如何使用查询游标对数据进行分页并在多个字段上实现 OR?

以上是关于在 Firestore 查询中实现 OR - Firebase firestore的主要内容,如果未能解决你的问题,请参考以下文章

合并 Firestore 查询时出现重复数据

在 Android Studio Firestore 中获取查询时出现错误

如何在android Firestore上实现Paginate查询[重复]

Flutter Firestore - 获取存储为字符串的 URL 时出现空安全错误

我们如何在sql CTE中实现动态查询?

在 PDO 中实现 LIKE 查询