我正在尝试检索记录列表,并按每个记录中的字段之一排序,我希望能够检索页面中的数据。
根据Firebase documentation,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页(价格最低的商品+价格最低的第二名+价格最低的第三名)的代码:
(我正在使用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 $节点test.js
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}
第2页应该是价格最低的第三,第四和第五的产品,这意味着我的代码需要多一行:
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}
问题在于它再次返回了Page 1。如果文档正确,则结果应从键
-KlstB51ap1L2tcK8cL6
的记录开始。我尝试为价格字段添加
.indexOn
规则,但结果仍然相同。如果删除
orderByChild()
行,则结果确实从给定的键开始,但是排序当然是不正确的,而且其行为与文档相反...我发现这些其他Stack Overflow帖子描述了相同的问题:
Firebase orderByChild with startAt()'s second argument w/ pagination not odering
(请参阅下面的评论。我没有足够的声誉在此处添加链接)
但是,这些问题没有答案,答复也很少。 Github存储库中没有匹配搜索词
startat
的问题。还有其他人面临同样的问题吗?这个问题使得不可能以分页的方式检索排序的列表。
最佳答案
你快到了!
问题在于您如何在第二页上调用startAt
:
.startAt(null, '-KlstB51ap1L2tcK8cL6')
为了获得正确的结果,您需要同时输入所谓锚点项目的价格和密钥:
.startAt(99, '-KlstB51ap1L2tcK8cL6')
这样,Firebase会找到所有带有
price
99
的项目,然后返回从键'-KlstB51ap1L2tcK8cL6'
开始的项目。