我有一个供稿,可向用户显示艺术品。我想按用户发布的类别和时间来过滤用户发布的内容,以便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
答案 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
因此,您需要在后端执行一项操作,而在前端执行另一项操作