在 Firestore 查询中实施 OR - Firebase Firestore

IT技术 javascript firebase google-cloud-firestore
2021-01-13 16:14:03

我正在尝试在 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 中没有任何内容。

3个回答

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

例如对于上面的查询:

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

原答案

Cloud Firestore 中没有“OR”查询。如果您想在单个查询中实现这一点,您将需要一个像maker_or_checker_or_approver: true.

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

我正在做 3 个查询。这就是我正在做的。是的
2021-03-13 16:14:03
嗨,大家好。节点 SDK 是否有任何更新?多个查询似乎仍然是过滤多个字段的低效方法!
2021-03-14 16:14:03
所以,如果我让我们说一些类似twitter的东西,我只想看到我关注的人的推文,我不能说tweets.where(user == john OR lisa OR julia)
2021-03-17 16:14:03
您可以在此处跟踪 OR 功能的进度:issuetracker.google.com/issues/129070817
2021-03-31 16:14:03

现在,Firestore 中新增了对 theinarray-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']);

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

我正在尝试使用您的查询,但收到错误“提供给函数 Query.where() 作为其第二个参数的无效值“in”。可接受的值:<、<=、==、>=、>、数组包含”。请帮助我如何解决此错误
2021-04-01 16:14:03
它可能尚未在您使用的客户端库中实现。最后我查了一下,它只在最新版本的 NodeJS 和 Python SDK 中实现。随着时间的推移,它可能会推广到更多的客户端库。
2021-04-11 16:14:03

您可以使用 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))))
2021-03-20 16:14:03
如何使用查询游标对数据进行分页并在多个字段上实现 OR?
2021-04-12 16:14:03