Фильтры Where () и orderBy () не работают вместе при фильтрации данных Firebase - PullRequest
0 голосов
/ 16 октября 2019

У меня есть лента, которая показывает художественные работы пользователей. Я хочу отфильтровать сообщения пользователей по категории и времени, когда пользователь их опубликовал, чтобы в ленте были самые последние сообщения ближе к верхней части страницы. Я использую функцию 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 ]

2 голосов
/ 16 октября 2019

Я думаю, вам нужно добавить определенный индекс следующим образом:

collectionId      Fields indexed       Query scope            Status 


tasks             category Ascending   Collection             Enabled 
                  date Descending
1 голос
/ 16 октября 2019

Вы МОЖЕТЕ объединить 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

Итак, вам нужно будет выполнить одну операцию в бэкэнде, а другую - в передней -конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...