如何在Firestore嵌套对象中新增字段而非更新原有内容?
如何在Firebase中给嵌套对象新增字段而不覆盖原有内容
嗨,这个问题我之前也踩过坑!其实不用纠结,Firebase的update()方法天生就支持给嵌套对象新增字段且不覆盖原有内容,完全不用怕把原来的favorites数据弄没。
正确的实现方式
你只需要在update()里用点符号路径指定要新增的嵌套字段就行,Firebase会自动识别并添加这个字段,不会改动favorites里的其他原有属性。比如你要加firebase: "Help",代码可以这么写:
// 先初始化文档(原有数据) var frankDocRef = db.collection("users").doc("frank"); frankDocRef.set({ name: "Frank", favorites: { food: "Pizza", color: "Blue", subject: "recess" }, age: 12 }); // 给favorites新增firebase字段,不覆盖原有内容 db.collection("users").doc("frank").update({ "favorites.firebase": "Help" }) .then(function() { console.log("Document successfully updated!"); });
执行完这段代码后,favorites就会变成你想要的样子:
favorites: { food: "Pizza", color: "Blue", subject: "recess", firebase: "Help" }
为什么用set会覆盖?
你提到用set配合点操作会覆盖全部内容,是因为set()方法默认是替换整个文档或指定对象的。如果直接写set({ "favorites.firebase": "Help" }),其实还是会把整个favorites替换成只包含firebase字段的对象。不过如果一定要用set实现,也可以加上merge: true参数,比如:
frankDocRef.set({ "favorites.firebase": "Help" }, { merge: true });
但这种情况显然用update()更直观,也更符合“更新/新增字段”的语义。
内容的提问来源于stack exchange,提问作者packability
相关产品推荐
相关产品推荐

