过滤 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 查询

查询中的Firebase多个WHERE子句[重复]

Where和Having的区别

数据库-过滤数据

具有索引合并 + orderby 的 Firebase 不起作用

在 Flutter 应用程序上过滤和排序 Firebase (Firestore) 数据