gpt4 book ai didi

javascript - Firebase js : startAt, orderByChild 和 limitToLast

转载 作者:行者123 更新时间:2023-12-01 03:14:05 25 4
gpt4 key购买 nike

我有以下查询来获取自上次获取以来最新的 16 篇文章:

db.ref("articles).startAt(null, "last_fetched_key").orderByChild("published").limitToLast(16);

所以它应该从我的最后一篇文章开始,然后通过子键“published”对这些文章进行排序,然后将这些结果限制为 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
},
}
}
}

最佳答案

您似乎误解了 startAt() 的参数如何工作。这里分为三个步骤:

  1. 首先,数据按照您的查询指示进行排序。如果您未指定任何顺序,数据将按优先级排序(这对于您案例中的所有数据都是相同的)
  2. 然后,查询会查找排序所依据的值与您指定的第一个参数相匹配的第一个子项。
  3. 然后,查询采用(可选)秒并删除键在此之前的所有项目。

因此,在您的查询中,如果您想要 1498230632003... 之后的下 4 项:

ref
.orderByChild("published")
.startAt(1100, "1498230632003-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7")
.once("value", function(snap) {
console.log("#2 Results: "+snap.numChildren()); // Results: 2
snap.forEach(function(child) {
console.log(child.key); // 1498230632003..., 1498230632000...
});
});

如果你想根据key确定从哪里开始查询结果,应该使用orderByKey():

ref
.orderByKey()
.startAt("1498230632003-3M7VnZESptDyGP4iN6BXlNqi6ukG4HgWkX4KvwiWEKs%3D_15cd582aa38%3A50c8a%3A35f03cd7")
.once("value", function(snap) {
console.log("#2 Results: "+snap.numChildren()); // Results: 1
snap.forEach(function(child) {
console.log(child.key); // 1498230632003...
});
});

我不完全确定,但似乎您正在尝试获取对属性进行排序的查询,并对键进行过滤。这在 Firebase 数据库查询模型中是不可能的。有关您的选项,请参阅 http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase

我的用于测试的jsbin:https://jsbin.com/xuwaxaq/edit?js,console

您的代码中的一些片段很难理解。我建议用我更惯用的变体替换它们:

countObj(data.val())

等同于:

snap.numChildren()

还有:

var lastKey = getLastKey(data);

等同于:

var lastKey;
snap.forEach(function(child) { lastKey = child.key; });

关于javascript - Firebase js : startAt, orderByChild 和 limitToLast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com