在 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 中新增了对 in
和 array-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的主要内容,如果未能解决你的问题,请参考以下文章
在 Android Studio Firestore 中获取查询时出现错误
如何在android Firestore上实现Paginate查询[重复]