【问题标题】:How to build a Firestore query chain based on a dynamic response from a promise如何基于 Promise 的动态响应构建 Firestore 查询链
【发布时间】:2020-03-24 14:02:48
【问题描述】:

假设我需要针对我在承诺中收到的一组主题查询 Firestore:

const subjects: string[] = await getSubjects(); //response: ['Math', 'Science', 'History'];

由于我不知道在任何给定时间可能会在承诺中返回多少主题,我将如何动态生成下面的链以便我可以正确查询 Firestore?

ref.where('subject[subjects[0].toLowerCase()]', '==' , true)
    .where('subject[subjects[1].toLowerCase()]', '==' , true)
    .where('subject[subjects[2].toLowerCase()]', '==' , true);

返回的主题越多,它需要生成的.where() 方法就越多。

【问题讨论】:

标签: javascript google-cloud-firestore


【解决方案1】:

创建查询遵循构建器模式:当您调用 where 时,它会返回一个 Query,然后您可以在该 Query 上再次调用 where

因此,如果您有一组主题并想要创建这些主题的查询,您可以这样做:

var query = firebase.firestore().collection("bla");
['Math', 'Science', 'History'].forEach((subject) => {
   query = query.where(`subject[${subject}.toLowerCase()]'`, '==' , true);
})
query.get()....

请注意,Firestore 现在支持 array-contains-any 运算符,对于这些类型的操作,它的扩展性明显更好,并且一次最多可以处理 10 个主题。

要使用它,您的文档需要包含一个数组 subjects,例如:

subjects: ['Math', 'Biology']

然后你会查询它:

var query = firebase.firestore().collection("bla")
  .where('subjects', 'array-contains-any', ['Math', 'Science', 'History']);
query.get()...

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 2022-10-04
    • 2010-10-04
    • 2018-09-20
    • 2021-01-10
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多