我有array = [ 'something', 'other' ]
我想从Firebase中仅检索那些2 ids
的值,其中包含超过2个项目(可能是数百万),但如果我这样做:
var questionRef = new Firebase(fireBaseURL+"/morethanamillionitems/");
loadUID.once('value', function (dataSnapshot) {
dataSnapshot.forEach(function(childSnapshot) { // Firebase method
console.log(dataSnapshot.numChildren()); // potentially outputs 1.000.000 +
var uid = childSnapshot.name();
var childData = childSnapshot.val();
console.log(uid.indexOf('something'));
result.push(uid)
});
}
我首先基本上加载整个数据库,这不是那么有效
现在我能做到:
array.forEach(key, function() {
var questionRef = new Firebase(fireBaseURL+"/morethanamillionitems/"+key);
refID = questionRef.val();
result.push(refID);
})
或者也许:
questionRef = new Firebase(fireBaseURL+"/morethanamillionitems/");
array.forEach(key, function() {
if ( questionRef.child(key) !== null ){
refID = questionRef.val();
result.push(refID);
}
})
最后一个似乎是最好的,前一个在旧RAM上看起来有点贵。
但是,我显然每次都要调用questionRef.once('value', function(){})
,因此已经加载了整个文档根...
或者我误解了Firebase如何处理这些请求? .numChildren()
只是直接来自服务器的答案吗?
.forEach
实际上是远程执行的吗?
我想知道是否有其他方法可以减少每个请求的流量。这让我想到了另一个问题:似乎firebase首先在本地搜索,但最终会进行远程搜索,但是当这种情况发生时它并不清楚。是否定期检查是否有变化?或者只有当我使用.on()而不是.once()时才会发生这种情况。 或者我是否为此目的使用了错误的后端?还有其他建议吗?我试过hood.ie,它仍然非常测试,看着Parse,但firebase似乎有我需要的简单。
(抱歉草率的语法,但你可以看到我的意图)
[更新] 我现在有这个:
load: function(uids){
var FB = new Firebase(URL);
uids.map(function(uid) {
var currentRef = FB.child( uid+"/_current" );
currentRef.once('value', function (each) {
eachVal = each.val()
if (eachVal !== null){
var localSave = {};
localSave[uid] = eachVal;
this.saveLocal(localSave)
} else {
console.error("Not found: [%s]", uid)
}}, function (err) { });
});
}
但是我仍然想知道请求何时实际发生在.child()
?或者在.once()
中,如果是后者,.child()
的用途是什么?它似乎只用于引用。
然后第二件事,如果我想要检索一百个项目的数组,这仍然意味着一百个单独的请求?或者Firebase是否有办法收集请求然后批量发送?
在最后一种情况下,.once
将是一个更保守的'初始检索的选项,如果您需要实时更新,则可以在以后添加.on
侦听器。