最佳实践问题
情况:
使用Angularfir2我试图找到最好的方法来检查我本地存储的项目列表中的哪些项目(如果有)存在于我的Firebase数据库中。这是考虑到我的Firebase数据库中有非常大量的数据(在此示例中为100k +条目但可能超过1M)并且本地有大量条目(在此示例中为200 +但可能超过1000)
以下是Firebase数据库的示例:
"project-1234": [
{
"animals" : {
"1" : {
"animal" : "aardvark"
},
...
"100001" : {
"animal" : "zebra"
}
}
}
]
以下是本地存储的json数据的示例:
[
{"my_id"=1, "fb_id"=346, "animal"="bear"},
...
{"my_id"=201, "fb_id"=45663, "animal"="water buffalo"}
]
现在我明白我可以简单地遍历每个项目然后制作一个Angularfire2"对象"调用(甚至是http.get)以查看数据库中是否存在该项:
this.data = [{...},...,{...}]; // local json data
for (let i in this.data) {
this.fbData.object('animals\' + this.data[i].fb_id).subscribe(dataObj => {
if (dataObj != null){
console.log('There is a : ', this.data[i].animal);
}
});
}
或
this.data = [{...},...,{...}]; // local json data
for (let i in this.data) {
let url = 'https://project-1234.firebaseio.com/animals/' + this.data[i].fb_id + '.json';
this.http.get(url).map(res => res.json()).subscribe((dataObj) => {
if (dataObj != null){
console.log('There is a : ', this.data[i].animal);
}
})
}
虽然这是我能想到实现目标的唯一方式,但即使是我的中间理解,这似乎也是一种劳动密集型,更不用说缓慢而且越慢,本地记录越多;所以我想知道是否有更好的解决方案或可以在这种情况下使用的最佳实践?
非常感谢任何帮助/建议。
答案 0 :(得分:0)
AngularFire2(或Firebase SDK)实现将比HTTP实现更有效,因为请求将被流水线化 - 请参阅this answer以获取更多详细信息。
要检索一个指示项目密钥是否存在的布尔数组,您可以执行以下操作:
import 'rxjs/add/operator/concatMap';
import 'rxjs/add/operator/first';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toArray';
Observable.from(items)
.concatMap(item => this.fbData.object(`animals/${item.fb_id}`).first().map(Boolean))
.toArray()
.subscribe((result) => console.log(result));
请注意,first
运算符用于从AngularFire2对象observables中检索单个值。如果没有first
运算符,对象可观察对象将无法完成,并将继续侦听和发出更改。
这种实施可能是可以接受的。你说"看起来有点劳力密集,更不用说缓慢而且速度越慢" ,但是你有没有对它进行过分析?
如果不了解您的应用程序,很难提供建议。例如,你提到它的"在本地保存的记录越来越慢#34; ,但是一旦你检查了数据库中是否存在记录,你能不能存储当地的知识?如果你能够做到这一点,也许你没有问题?