【问题标题】:Query multiple Firestore Collections for same field查询同一字段的多个 Firestore 集合
【发布时间】:2020-02-19 12:14:39
【问题描述】:

我正在寻找跨多个集合的文档,其中它们的文档没有描述字段,我想避免循环,但想找到最有效的方法。此代码适用于一个集合。

            firebase
            .firestore()
            .collection('creators') // ### Would need to loop for 4 others like this #####
            .where('description', '==', '')
            .get()
            .then((snapshot) => {
                if (snapshot.empty) {
                    console.log('No matching documents.')
                    return
                }

                snapshot.forEach((doc) => {
                    console.log(doc.id, '=>', doc.data())
                })
            })
            .catch((err) => {
                console.log('Error getting documents', err)
            })

【问题讨论】:

  • 循环有什么问题?
  • 我想我认为将一组工作发送到 Firebase 会更有效,它会分块并将结果发送给我,而不是 5 个请求。不过这样做可能不是问题。
  • 这种情况会经常重复吗?也许存储您需要的叠加状态(维护读取成本的更新)。
  • 是的,它用于 SaaS 产品的仪表板。它正在检查一堆集合的状态并提供建议。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

您可以使用Promise.all()并行执行所有查询,如下:

   const db = firebase.firestore();

   const q1 = db.collection('creators').where('description', '==', '...').get();
   const q2 = db.collection('xyz').where('description', '==', '...').get();

   return Promise.all([q1, q2])
   .then(snapshotsArray => {

       snapshotsArray.forEach(snap => {
            snap.forEach(doc => {
                console.log(doc.id, '=>', doc.data())
            })
       })

   })

您可以将其简化如下:

   const collectionNames = ['creators', 'klmn', 'opqr', 'stuv']
   const promises = collectionNames.map(x => db.collection(x).where('description', '==', '...').get());

   Promise.all(promises)
   .then(snapshotsArray => {

       snapshotsArray.forEach(snap => {
            snap.forEach(doc => {
                 console.log(doc.id, '=>', doc.data())
            })
       })

   })

如上述文档中所述:

Promise.all() 方法返回一个 Promise,当 作为可迭代对象传递的所有承诺都已实现

...

返回的 Promise 由一个包含所有 作为参数传递的可迭代的值(也是非承诺值)。


但是,

根据您问题中的这句话,有一点需要注意:“在多个集合中查找文档,这些集合中的文档没有描述字段”。

您不能在 Firestore 中构建一个将返回文档没有给定字段的查询。原因(索引机制)在这个官方video中有很好的解释。

另一方面,您可以查询具有空字段的文档:

db.collection('creators').where('description', '==', '').get();

或带有null 值的字段:

db.collection('creators').where('description', '==', null).get();

【讨论】:

  • 该字段将存在,只是空的。很好的解释,谢谢。
  • @PhillDuffy 很高兴我能帮助你!您可以接受答案,如果您认为它可以解决您的问题,请参阅stackoverflow.com/help/someone-answers。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-08
  • 2020-07-14
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2020-11-21
相关资源
最近更新 更多