在Firebase实时数据库中推送到数据列表的最大往返次数是多少?

时间:2017-11-20 15:35:17

标签: angular typescript firebase firebase-realtime-database angularfire2

在我的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上发现了一个类似问题的问题,但我不了解更新部分。

我的两个问题是:

  1. Firebase中是否有最大往返次数或是否存在其他错误?

  2. 如何通过将代码组合到多位置更新中来使我的代码正常工作?

1 个答案:

答案 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 AngularFireupdate specific fields using the JavaScript SDK