过滤 Firebase 数据时,Where() 和 orderBy() 过滤器不能一起工作
Posted
技术标签:
【中文标题】过滤 Firebase 数据时,Where() 和 orderBy() 过滤器不能一起工作【英文标题】:Where() and orderBy() filter not working together when filtering firebase data 【发布时间】:2020-02-13 14:58:28 【问题描述】:我有一个显示用户作品的提要。我想按用户发布的类别和时间过滤用户帖子,以便提要的最新帖子更靠近页面顶部。我正在使用 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
)
但是,我在控制台上收到一条错误消息,显示“ERROR Error: INTERNAL”。
当我单独使用 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
【问题讨论】:
【参考方案1】:你需要添加一个特定的索引如下:
collectionId Fields indexed Query scope Status
tasks category Ascending Collection Enabled
date Descending
【讨论】:
【参考方案2】:只有在对同一字段进行过滤时,才可以在使用范围比较运算符时组合 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
因此,您需要在后端执行一项操作,而在前端执行另一项操作
【讨论】:
OP 正在使用where('category', '==', 'art')
(不是范围比较过滤器),并且在声明正确的复合索引后查询确实有效。【参考方案3】:
有同样的问题, 但是,当我运行应用程序时,它会在控制台中记录一个错误,该查询需要创建一个复合索引,它给了我一个链接,通过单击我能够创建,并且需要几分钟才能启用。之后它起作用了..希望有人能提供帮助
【讨论】:
以上是关于过滤 Firebase 数据时,Where() 和 orderBy() 过滤器不能一起工作的主要内容,如果未能解决你的问题,请参考以下文章
firebase firestore flutter where 查询