在我的angular 4应用程序中,我使用push()
方法将数据附加到Firebase实时数据库中的数据列表。请参阅Firebase文档:https://firebase.google.com/docs/database/web/lists-of-data
每次将新子项添加到指定的Firebase参考时,push()
方法都会生成唯一键。这是一个数组'市场',由250个对象组成,其中包含符号,价格,余额:
market = [
{ symbol: '1ST', price_usd: 1, balance: 100},
{ symbol: '2ND', price_usd: 2, balance: 300},
{ symbol: '3RD', price_usd: 3, balance: 400}
// etc etc for a total of 250 objects
];
我在Angular 4组件中编写了以下代码:
import {AngularFireDatabase} from 'angularfire2/database';
import * as firebase from 'firebase';
constructor(private db: AngularFireDatabase) {}
storeTicker() {
const timestamp = firebase.database.ServerValue.TIMESTAMP;
for (let object of market) {
const path = object['symbol'];
const itemsRef = this.db.list('Tickers/' + path);
itemsRef.push({ symbol: path, price_usd: object['price_usd'], balance: object['balance'], time: timestamp});
}
}
单击按钮时执行代码,这将导致每个引用的时间序列。
我的Firebase实时数据库如下所示:
{ "Tickers" : {
"1ST" : {
"-Kx8gN5uZALd5BP2GCH6" : {
"balance" : 0,
"price_usd" : 0.25583,
"symbol" : "1ST",
"time" : 1508769890908
}},
"2ND" : {
"-Kx8Z0xCl7ONZERk1ICo" : {
"balance" : 0,
"price_usd" : 0.0253829,
"symbol" : "2ND",
"time" : 1508769890908
}},
"3RD" : {
"-Kx8gN5FEZEPsOe8S-Tw" : {
"balance" : 0,
"price_usd" : 0.767354,
"symbol" : "3RD",
"time" : 1508769890908
}},
// for a total of 250 paths
}}
以这种方式每次拨打push()
都会导致到Firebase的往返。问题是Firebase仅对前100个引用执行push()
。
我找不到Firebase文档中往返次数的限制:https://firebase.google.com/docs/database/usage/limits
我在Stackoverflow Adding list of data in Firebase上发现了一个类似问题的问题,但我不了解更新部分。
我的两个问题是:
Firebase中是否有最大往返次数或是否存在其他错误?
如何通过将代码组合到多位置更新中来使我的代码正常工作?
答案 0 :(得分:1)
使用不带参数的push()
方法将在本地生成唯一ID,而不会导致对数据库的网络操作:
如果您为
push()
提供值,则该值将写入。{ 生成的位置。如果您没有传递值,则不会写入任何内容 到数据库,孩子将保持空白(但你可以使用 其他地方Reference
。
因此,您可以使用它来获取推送到数据库所需的每个项目的唯一ID,将其存储在数组中,然后使用update()
将所有项目同时发送到数据库中位置更新,如:
storeTicker() {
const timestamp = firebase.database.ServerValue.TIMESTAMP;
var updates = {};
for (let object of market) {
const key = this.db.list('/Tickers').push().key; // Get a new unique key (locally, no network activity)
const path = object['symbol'] + '/' + key;
updates[path] = {symbol: object['symbol'], price_usd: object['price_usd'], balance: object['balance'], time: timestamp};
}
this.db.object('/Tickers').update(updates);
}
update()
方法(类似于官方Firebase JavaScript SDK update()
method)通过将整个数组发送到指定位置来工作:
values
参数包含多个将一起写入数据库的属性 - 值对。每个子属性可以是从当前位置到要更新的数据的简单属性(例如,“name”)或相对路径(例如,“name / first”)。
有关此问题的文档示例,请参阅updating data using AngularFire或update specific fields using the JavaScript SDK。