Фильтровать и сортировать по нескольким значениям с помощью Firebase

Я создаю социальное приложение, используя Firebase. Я храню сообщения в Firebase следующим образом:

posts: {
   "postid": {
      author: "userid" 
      text: "",
      date: "timestamp"
      category: "categoryid"
      likes: 23
   }
}

Каждое сообщение относится к категории, и возможно походить на сообщения.

Теперь я пытаюсь показать сообщения, относящиеся к определенной категории, отсортированные по количеству понравившихся. Возможно, я также хочу ограничить фильтр по дате, чтобы показывать только самые последние, самые любимые должности в категории. Как я могу это сделать?

Функциональность запросов Firebase, похоже, не поддерживает несколько запросов вроде этого, что кажется странным...

Ответ 1

Вы можете использовать только одну функцию заказа с запросами базы данных Firebase, , но правильная структура данных позволит вам запрашивать несколько полей.

В вашем случае вы хотите заказать по категориям. Вместо категории в качестве свойства он может выступать в качестве индекса под posts:

posts: {
   "categoryid": {
       "postid": {
         author: "userid" 
         text: "",
         date: "timestamp",
         category: "categoryid",
         likes: 23
       }
   }
}

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

let postsRef = Firebase(url: "<my-firebase-app>/posts")
let categoryId = "my-category"
let categoryRef = postsRef.childByAppendingPath(categoryId)
let query = categoryRef.queryOrderedByChild("date")
query.observeEventType(.ChildAdded) { (snap: FDataSnapshot!) {
  print(snap.value)
}

Приведенный выше код создает ссылку для сообщений по определенной категории и заказы по дате. Множество запросов возможно по структуре данных. Закрытие обратного вызова срабатывает для каждого отдельного элемента под указанной категорией.

Если вы хотите продолжить запрос, вам придется выполнять фильтрацию данных на стороне клиента.