Firebase:使用Firebase Object Observable进行多位置更新

时间:2018-01-15 00:55:44

标签: arrays firebase firebase-realtime-database angularfire2

我正在尝试使用FirebaseObjectObservable进行多位置更新。

这就是我的数据。

recipes: {
  -R1: {
    name: 'Omelette',
    ingredients: ['-I1']
  }
}

ingredients: {
  -I1: {
    name: 'Eggs',
    recipes: ['-R1']
  },
  -I2: {
    name: 'Cheese',
    recipes: []
  }
}

我想更新该食谱并添加额外成分。

const recipe = this.af.database.object(`${this.path}/${key}`);
recipe.update({
  name: 'Cheesy Omelette',
  ingredients: ['-I1', '-I2']
});

并相应地进行多地点更新:

recipes: {
  -R1: {
    name: 'Cheesy Omelette',
    ingredients: ['-I1', '-I2'] // UPDATED
  }
}

ingredients: {
  -I1: {
    name: 'Eggs',
    recipes: ['-R1']
  },
  -I2: {
    name: 'Cheese',
    recipes: ['-R1'] // UPDATED
  }
}

这是否可以在Firebase中使用?那么更新会导致1000次写入的情况呢。

1 个答案:

答案 0 :(得分:2)

将您的成分存放在一个阵列中会使添加成分变得非常困难。这是因为数组是基于索引的:为了将项添加到数组,您必须知道该数组中已有多少项。

由于该数字需要从数据库中读取,因此代码变得非常棘手。我能想到的最佳代码是:

recipe.child("ingredients").orderByKey().limitToLast(1).once("child_added", function(snapshot) {
  var updates = {};
  updates[parseNum(snapshot.key)+1] = "-I2";
  recipe.child("ingredients").update(updates);
});

尽管阅读起来非常棘手,但它仍然不是很好。如果多个用户几乎同时尝试更改配方的成分,则此代码将失败。所以你真的应该使用一个事务,它会读取更多数据并损害你应用的可扩展性。

这是Firebase has always recommended against using arrays

的原因之一

用于存储食谱配料的更好结构是一套。有了这样的结构,您的食谱将如下所示:

recipes: {
  -R1: {
    name: 'Omelette',
    ingredients: { 
      "-I1": true 
    }
  }
}

您可以使用以下方法轻松地将新配料添加到配方中:

recipe.update({ "ingredients/-I2": true });