我有一个饲料,显示用户的艺术品。我想过滤的类别和时间,用户发布的用户职位,使饲料将有最新的职位接近页面的顶部。我使用一个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()
}
})
})
型
艺术饲料 typescript :
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
型
3条答案
按热度按时间vcirk6k61#
您需要添加一个特定的索引,如下所示:
字符串
lbsnaicq2#
只有在过滤同一字段时,才可以在使用范围比较运算符时组合合并
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
因此,您需要在后端执行一个操作,在前端执行另一个操作
jljoyd4f3#
有同样的问题,但当我运行应用程序时,它在控制台中记录了一个错误,该查询需要创建一个复合索引,它给了我一个链接,通过点击,我能够创建,花了几分钟的时间来enble.之后,它的工作..希望有人会帮助