12

如果我这样做,我的 itemRef 一切都很好:

itemRef.child('appreciates').set(newFlag);
itemRef.child('id').set(newId);

itemRef 的其他属性仍然存在,但 child_changed 被调用了两次

如果我这样做:

itemRef.set({appreciates:newFlag,id:newId});

child_changed 只被调用一次,但我的其他属性被破坏了。除了重新填充整个参考对象的笨拙之外,还有其他解决方法吗?

谢谢,

蒂姆

4

5 回答 5

18

Firebase update() 函数将允许您修改对象的某些子对象,同时保持其他对象不变。更新函数只会在其他客户端上为正在写入的路径触发一个“值”事件,无论有多少孩子被改变。

在此示例中,您可以执行以下操作:

itemRef.update({appreciates:newFlag,id:newId});

update() 的文档在这里

于 2013-01-12T03:26:47.780 回答
4

如果数据已经存在,您可以创建一个规则来防止覆盖。转载自Firebase 文档现有数据与新数据

// we can write as long as old data or new data does not exist
// in other words, if this is a delete or a create, but not an update
".write": "!data.exists() || !newData.exists()"
于 2017-11-29T23:41:50.323 回答
2

虽然您可以使用update,但您也可以setmerge选项设置为true

itemRef.set({ appreciates:newFlag, id:newId }, { merge: true });

如果它不存在,这将创建一个新文档,如果存在则更新现有文档。

于 2020-05-01T07:16:35.787 回答
2

现在.update会处理它,您可以更改现有数据或添加新数据,而不会影响您已经拥有的其余数据。

在此示例中,我使用此函数将产品设置为已售出,该产品具有其他带有数据的变量,可能有也可能没有soldsellingTime但没关系,因为它是否不存在将创建它们,如果存在,将更新数据

var sellingProduct = function(id){
 dataBase.ref('product/'+id).update({
   sold:true,
   sellingTime: Date.now(),

 }).then (function(){
   alert ('your product is flaged as sold')

 }).catch(function(error){
    alert ('problem while flaging to sold '+ error)
 })

}
于 2017-12-13T14:41:55.603 回答
1

I've been trying to do this having a structure like the following:

Firebase gigs database structure

The problem I was having was when running say set on specific fields such as name, description and date all of the other child nodes would then be removed with the following:

return (dispatch) => {
    firebase.database().ref(`/gigs/${uid}`)
        .set({ name, description, date })
        .then(() => {
            dispatch({ type: GIG_SAVE_SUCCESS });
            Actions.home({ type: 'reset' });
        });
};

Leaving only the name, description and date nodes but using the following the specific nodes are updated without removing the other child nodes i.e. members, image etc:

return (dispatch) => {
    var ref = firebase.database().ref(`/gigs/${uid}`);
    ref.child('name').set(name)
    ref.child('description').set(description)
    ref.child('date').set(date)
        .then(() => {
            dispatch({ type: GIG_SAVE_SUCCESS });
            Actions.home({ type: 'reset' });
        });
}; 
于 2017-05-16T13:03:49.733 回答