Javascript firebase查询的优化。通过ids获取数据
我是Firebase的新手。我想创建一个应用程序(使用AngularFire库和AngularFire库),显示一些商品的当前价格。我已按以下格式列出Firebase实时数据库中的所有可用软件:Javascript firebase查询的优化。通过ids获取数据,javascript,firebase,firebase-realtime-database,angularfire,ngrx,Javascript,Firebase,Firebase Realtime Database,Angularfire,Ngrx,我是Firebase的新手。我想创建一个应用程序(使用AngularFire库和AngularFire库),显示一些商品的当前价格。我已按以下格式列出Firebase实时数据库中的所有可用软件: "warehouse": { "wares": { "id1": { "id": "id1", "name": "name1", "price": "0.99" }, "id2": { "i
"warehouse": {
"wares": {
"id1": {
"id": "id1",
"name": "name1",
"price": "0.99"
},
"id2": {
"id": "id2",
"name": "name2",
"price": "15.00"
},
... //much more stuff
}
}
我在我的应用程序中使用了ngrx
,因此我认为我可以加载所有商品,将存储为对象而不是列表,因为规范化了状态树。我希望load wares以这种方式存储:
this.db.object('warehouse/wares').valueChanges();
问题是商品价格每5分钟就会刷新一次。og产品数量巨大(约3000件),因此一个响应的重量约为700kB。我知道用这种方式,我将在短时间内超过下载数据的限制
我想把加载数据限制在用户感兴趣的范围内,这样每个用户都可以选择商品。我将按以下方式存储此选项:
"users": {
"user1": {
"id": "user1",
"wares": {
"id1": {
"order": 1
},
"id27": {
"order": 2
},
"id533": {
"order": 3
}
},
"waresIds": ["id1", "id27", "id533"]
}
}
我的问题是: 有没有办法根据WaresID的当前用户获取商品?我的意思是,是否存在只获取ID位于参数数组中的商品的方法?F.e
"wares": {
"id1": {
"id": "id1",
"name": "name1",
"price": "0.99"
},
"id27": {
"id": "id27",
"name": "name27",
"price": "0.19"
},
"id533": {
"id": "id533",
"name": "name533",
"price": "1.19"
}
}
对于类似查询:
this.db.object('warehouse/wares').contains(["id1", "id27", "id533"]).valueChanges();
我在equalTo等有角度的Fire中看到了查询限制,但每个都是针对列表的。我完全糊涂了。有人能帮我吗?也许我在应用程序结构的设计上犯了错误。如果是这样,我要求澄清。是的,您可以在firebase中获得您想要的确切数据 您需要获得每个
waresID
var waresID = // logic to get waresID
var userId = // logic to get userId
var ref = firebase.database().ref("wares/" + userId).child(waresID);
ref.once("value")
.then(function(snapshot) {
console.log(snapshot.val());
});
这将只返回与该waresID
或userId
注意:这是javascript代码,我希望这对您有用。您可以做两件事。我不相信Firebase允许您同时查询多个equals值。但是,您可以在“id”数组上循环并直接查询每个id 我假设您已经查询了
“waresid”
,并且已将这些ID存储在名为idArray的数组中:
for id in idArray {
database.ref('warehouse/wares').orderByChild('id').equalTo(id).once('value').then((snapshot) => {
console.log(snapshot.val());
})
}
为了有效地使用上述查询,您必须
您的第二个选项是
.childChanged
,以便在初始获取后仅获取更新的数据。这将大大减少您需要下载的数据量 因为您正在用户内部保存ID,请尝试这种方式
wares: Observable<any[]>;
//inside ngOnInit or function
this.wares = this.db.list('users/currentUserId/wares').snapshotChanges().map(changes => {
return changes.map(c => {
const id = c.payload.key; //gets ids under users/wares/ids..
let wares=[];
//now get the wares
this.db.list('warehouse/wares', ref => ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(res=>{
res.forEach(data=>{
wares.push(data);
})
});
return wares;
});
});
商品:可见;
//在它或函数内部
this.wares=this.db.list('users/currentUserId/wares').snapshotChanges().map(changes=>{
返回changes.map(c=>{
const id=c.payload.key;//获取users/ware/ids下的id。。
让商品=[];
//现在去拿货物
这个.db.list('warehouse/wares',ref=>ref.orderByChild('id').equalTo(id)).valueChanges().subscribe(res=>{
res.forEach(数据=>{
推送(数据);
})
});
退货;
});
});
记得为性能优势定义索引,它是angularfire的版本?@Hareesh“angularfire2”:“^5.0.0-rc.4”如果我使用this.db.object('wallet/currences/${id}')”
而不是this.db.list('warehouse/wares',ref=>ref.orderByChild('id').equalTo(id)),firebase是否有区别
?是列表
返回对象数组,即使只得到一个结果。你需要通过它来获得实际的数据。