Я пытаюсь просто получить список записей, отсортированных по одному из полей в каждой записи, и я хотел бы получить данные на страницах.
Согласно документации 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
.
Кто-нибудь еще сталкивается с той же проблемой? Эта проблема не позволяет получить отсортированный список с разбивкой по страницам...
Ты почти там!
Проблема заключается в том, как вы вызываете startAt
для второй страницы:
.startAt(null, '-KlstB51ap1L2tcK8cL6')
Чтобы получить правильные результаты, вам необходимо передать как цену, так и ключ так называемого элемента привязки:
.startAt(99, '-KlstB51ap1L2tcK8cL6')
С этим Firebase найдет все предметы с price
99
а затем вернет элементы, начинающиеся с ключа '-KlstB51ap1L2tcK8cL6'
.