我正在尝试使用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次写入的情况呢。
答案 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 });