在firestore查询中实现OR- Firebase firestore

ogq8wdun  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(169)

我正在尝试实现逻辑或操作符在firestore查询。

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中没有任何内容。

kpbpu008

kpbpu0081#

**编辑(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这样的字段。
当然,你总是可以做三个查询并在客户端连接它们。

6mzjoqzu

6mzjoqzu2#

现在,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

zysjyyx4

zysjyyx43#

你可以使用rxjs合并这些可观测的数据,参见下面的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))
}
5vf7fwbs

5vf7fwbs4#

FTI OR查询现已在预览版中提供:)
来源:https://cloud.google.com/firestore/docs/release-notes#March_24_2023

相关问题