过滤Firebase数据时,where()和orderBy()过滤器无法一起使用

时间:2019-10-16 18:50:02

标签: angular typescript firebase google-cloud-functions angularfire2

我有一个供稿,可向用户显示艺术品。我想按用户发布的类别和时间来过滤用户发布的内容,以便Feed中的最新帖子更接近页面顶部。我正在使用Firebase函数来检索此数据。

我有一个像这样的Firestore集合

 tasks -tasksID- 
                {
                   category: art
                   date: 16 october at 3:00pm
                     images: {
                                0 image1
                                1 image2
                             }
                  }

firebase函数:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin'

admin.initializeApp()

export const getFeed = functions.https.onCall(async (req,res) =>{
  const docs = await admin.firestore().collection('tasks').where('category', 
    '==', 'art').orderBy('date', 'desc').limit(20).get()    
    return docs.docs.map(doc => {
    return {
        postID: doc.id,
        ...doc.data()
         }
     }) 
 })

艺术提要打字稿:

artFeed (){    
  const getFeed = this.aff.httpsCallable('getFeed')
  this.ajax = getFeed({}).subscribe(data=> {
    console.log(data)
    this.posts =  data
      })  
  }

但是,我在控制台上看到一条错误消息,提示“错误错误:内部”。

当我分别单独使用where()函数和orderby()函数时,此函数可以很好地工作。

这也是我的数据库索引的样子。

collectionId      Fields indexed       Query scope            Status 

              category Ascending
tasks         uid Ascending              Collection            Enabled 
              date Ascending


tasks        category Ascending          
             uid Ascending                Collection            Enabled
             date Descending

2 个答案:

答案 0 :(得分:2)

我认为您需要添加一个特定的索引,如下所示:

collectionId      Fields indexed       Query scope            Status 


tasks             category Ascending   Collection             Enabled 
                  date Descending

答案 1 :(得分:1)

仅当您在同一字段上进行过滤时,才可以在使用范围比较运算符时组合Where()OrderBy()

如Firebase文档所述:

  

但是,如果您有一个具有范围比较(<,<=,>,> =)的过滤器,   您的第一笔订单必须在同一字段上:

  • 有效> citiesRef.where("population", ">", 100000).orderBy("population")
  • 无效> citiesRef.where("population", ">", 100000).orderBy("country")

https://firebase.google.com/docs/firestore/query-data/order-limit-data

因此,您需要在后端执行一项操作,而在前端执行另一项操作