Firestore使用merge模式未替换Map问题求助(Dart/Flutter)
解决Firestore中嵌套Map未被替换而是新增键的问题
你尝试用以下Dart/Flutter代码更新Firestore中的嵌套Map:
await FirebaseFirestore.instance.collection("test").doc("test").set({ "abc": {"def": 123} }, SetOptions(merge: true)); await FirebaseFirestore.instance.collection("test").doc("test").set({ "abc": {"abc": 123} }, SetOptions(merge: true));
但实际结果是代码并未替换已存在的abc子Map,而是向其中新增了abc键,最终abc字段下同时存在def:123和abc:123两个键。
问题原因
使用SetOptions(merge: true)时,Firestore会对嵌套的Map字段执行合并操作:它只会将新的键值对添加到子Map中,而不会替换整个子Map。所以第二次调用set时,只会在abc子Map里新增abc:123,不会覆盖原有的def:123。
解决方法
方法1:使用update方法替换整个子Map
如果只想替换abc子Map,同时保留文档中的其他字段,推荐使用update方法:
await FirebaseFirestore.instance.collection("test").doc("test").update({ "abc": {"abc": 123} });
update方法会直接替换指定的字段(包括嵌套的Map),不会合并子Map内部的键值对。
方法2:调整set方法的参数(按需使用)
如果一定要用set方法且需要保留文档其他字段,可以通过mergeFields参数明确指定只合并顶级字段abc,这样会直接替换整个abc子Map:
await FirebaseFirestore.instance.collection("test").doc("test").set({ "abc": {"abc": 123} }, SetOptions(mergeFields: ["abc"]));
⚠️ 注意:如果直接去掉merge相关参数调用set,会覆盖整个文档,若文档中有其他重要字段会丢失数据,需谨慎使用。
内容的提问来源于stack exchange,提问作者Karel Debedts
相关产品推荐
相关产品推荐

