【发布时间】:2017-08-12 10:52:10
【问题描述】:
我有以下查询来获取自上次获取以来最新的 16 篇文章:
db.ref("articles).startAt(null, "last_fetched_key").orderByChild("published").limitToLast(16);
所以它应该从我的最后一篇文章开始,然后按子键“已发布”对它们进行排序,然后将这些结果限制为 16 个。
只要我不做 orderByChild("published") 它就可以工作,但如果我做了,我总是会得到 16 件物品?
注意:我在 nodejs (firebase-admin 5.1.0) 和浏览器 (firebase-sdk 4.2.0) 上都看到了这种行为
示例:(数据示例见下文)
function countObj(obj) { var c=0; for (var k in obj) { c++; } return c; }
function getLastKey(obj) { var lk=null; for (var k in obj) { lk = k; } return lk; }
firebase.database().ref("articles/-KnLhC7S0wtNV17R-w2I")
.orderByChild("published")
.limitToLast(4) // limit 4,
.once("value", function(snap) {
var data = snap.val();
console.log("#1 Results: "+ countObj(data.val())); // Results: 4
var lastKey = getLastKey(data);
// With .orderByChild("published")
// Should return 1 result because articles contains 4, we pass the 4th key to startAt()
firebase.database().ref("articles/-KnLhC7S0wtNV17R-w2I")
.startAt(null, lastKey) // use startAt
.orderByChild("published")
.limitToLast(4)
.once("value", function(snap) {
var data = snap.val();
console.log("#2 Results: "+ countObj(data.val())); // Results: 4
});
// Without .orderByChild("published")
// Returns 1 result because articles contains 4, we pass the 4th key to startAt()
firebase.database().ref("articles/-KnLhC7S0wtNV17R-w2I")
.startAt(null, lastKey) // use startAt
.limitToLast(4)
.once("value", function(snap) {
var data = snap.val();
console.log("#3 Results: "+ countObj(data.val())); // Results: 1
});
});
数据:
{
"articles" : {
"-KnLhC7S0wtNV17R-w2I" : {
"1498230632000-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7" : {
"published" : 1498230632000
},
"1498230632001-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7" : {
"published": 1000
},
"1498230632002-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7" : {
"published": 900
},
"1498230632003-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7" : {
"published": 1100
},
}
}
}
【问题讨论】:
-
请分享重现问题所需的最小 JSON(以文本形式,无屏幕截图)。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。
-
完成! (我希望我的示例代码足够清楚.. 在这里输入所以没有检查.. :))
标签: javascript firebase firebase-realtime-database