Нумерация страниц с помощью startAt () при заказе ребенком

1

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

Согласно документации Firebase, метод reference.startAt() имеет необязательный второй параметр, который:

The child key to start at. This argument is only allowed if ordering by child, value, or priority.

Прежде всего, вот данные:

{
  "products" : {
    "-KlsqFgVWwUrA-j0VsZS" : {
      "name" : "Product 4",
      "price" : 666
    },
    "-Klst-cLSckuwAuNAJF8" : {
      "name" : "Product 1",
      "price" : 100
    },
    "-Klst7IINdt8YeMmauRz" : {
      "name" : "Product 2",
      "price" : 50
    },
    "-Klst9KfM2QWp8kXrOlR" : {
      "name" : "Product 6",
      "price" : 30
    },
    "-KlstB51ap1L2tcK8cL6" : {
      "name" : "Product 5",
      "price" : 99
    },
    "-KlstDR5cCayGH0XKtZ0" : {
      "name" : "Product 3",
      "price" : 500
    }
  }
}

И вот код, который способен восстановить страницу 1 (самый дешевый товар + 2-й самый дешевый + 3-й самый дешевый):

(Я использую Firebase JS SDK 4.1.1)

'use strict';
var firebase = require('firebase');

firebase.initializeApp({
    apiKey: "your-api-key",
    authDomain: "your-firebase-domain",
    databaseURL: "https://your-db.firebaseio.com",
    projectId: "your-project",
    storageBucket: "your-bucket.appspot.com",
    messagingSenderId: "your-sender-id"
})

firebase.database().ref('products')
.orderByChild('price')
.limitToFirst(3)
.on('child_added', function (snapshot) {
    var key = snapshot.key;
    var data = snapshot.val();
    console.log(key + ': ' + JSON.stringify(data))
})

Выход:

TJ: база данных tjwoon $ node test.js

-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}

Страница 2 должна быть третьим самым низким, 4-м и 5-м наименее оцененными продуктами, что означает, что моему коду нужна одна дополнительная строка:

firebase.database().ref('products')
.orderByChild('price')
.startAt(null, '-KlstB51ap1L2tcK8cL6')
.limitToFirst(3)
.on('child_added', function (snapshot) {
    var key = snapshot.key;
    var data = snapshot.val();
    console.log(key + ': ' + JSON.stringify(data))
})

Выход:

TJ:database tjwoon$ node test.js
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}

Проблема в том, что он снова возвращается. Если документация верна, результаты должны начинаться с записи с помощью клавиши -KlstB51ap1L2tcK8cL6.

Я попытался добавить правило .indexOn для поля цены, но результаты остались идентичными.

Если я удалю orderByChild(), результаты начнутся с данного ключа, но, конечно, сортировка неверна, а также ведет себя в противоположность документации...

Я нашел эти другие записи, которые описывают одну и ту же проблему:

Однако ответов на эти вопросы нет и довольно мало ответов. В репозитории Github нет проблем, которые соответствуют поисковому запросу startat.

Кто-нибудь еще сталкивается с той же проблемой? Эта проблема не позволяет получить отсортированный список с разбивкой по страницам...

Теги:
firebase
pagination
firebase-realtime-database

1 ответ

3
Лучший ответ

Ты почти там!

Проблема заключается в том, как вы вызываете startAt для второй страницы:

.startAt(null, '-KlstB51ap1L2tcK8cL6')

Чтобы получить правильные результаты, вам необходимо передать как цену, так и ключ так называемого элемента привязки:

.startAt(99, '-KlstB51ap1L2tcK8cL6')

С этим Firebase найдет все предметы с price 99 а затем вернет элементы, начинающиеся с ключа '-KlstB51ap1L2tcK8cL6'.

  • 1
    Спасибо! Похоже, что 1-й параметр является «основным» критерием startAt, а 2-й параметр служит своего рода значением для устранения неоднозначности в случае, если несколько детей имеют одно и то же значение. Это потрясающе, большое спасибо!
  • 0
    Я хотел бы знать, как использовать эту функцию через REST. Если кто-то может помочь, это то, что я спрашиваю на stackoverflow.com/questions/45909798/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню