更新嵌套对象 Firebase
Posted
技术标签:
【中文标题】更新嵌套对象 Firebase【英文标题】:Updating nested objects firebase 【发布时间】:2016-02-20 11:06:28 【问题描述】:来自 Firebase 说明:
给定一个像alanisawesome
这样的单一键路径,updateChildren()
只更新第一个子级别的数据,任何传入超过第一个子级别的数据都被视为setValue()
操作。多路径行为允许在不覆盖数据的情况下使用更长的路径(如alanisawesome/nickname
)。这就是第一个示例与第二个示例不同的原因。
我试图在我的代码中使用单个函数createOrUpdateData(object)
。在更新的情况下,它会正确更新第一级子对象,但如果我传递了嵌套对象,那么它会删除该嵌套对象的所有其他属性。
代码如下:
function saveUserDetails(email,object)
var hashedEmail = Utilities.getHashCode(email);
var userRef = ref.child(hashedEmail);
return $q(function(resolve,reject)
return userRef.update(object, function(error)
if(error)
reject(error);
else
resolve("Updated successfully!");
);
);
如果我通过了:
name: 'Rohan Dalvi',
externalLinks:
website: 'mywebsite'
然后它将删除 externalLinks 对象中的其他属性。有没有更清洁和更简单的方法来避免这种情况?
简而言之,我如何确保只更新嵌套对象而不删除数据。
【问题讨论】:
嗨@DavidEast,谢谢它有效!虽然我没有尝试更新嵌套对象中的数组。 【参考方案1】:您可以使用多路径更新。
var userRef = ref.child(hashedEmail);
var updateObject =
name: 'Rohan Dalvi',
"externalLinks/website": 'mywebsite'
;
userRef.update(updateObject);
通过在对象字面量中使用"externalLinks/website"
语法,它会将嵌套路径视为更新,而不是嵌套对象的集合。 这样可以防止嵌套数据被删除。
【讨论】:
太棒了!谢谢! 我们如何使用动态对象名称来做到这一点? @OliverDixon 在 ES6 中,您可以使用计算属性名称,如下所示:js const dynamicProperty = 'foo'; const updateObject = name: 'Rohan Dalvi', [dynamicProperty]: 'mywebsite' ;
您还可以将静态字符串与动态部分结合起来,如下所示:js const updateObject = name: 'Rohan Dalvi', [`externalLinks/$dynamicProperty`]: 'mywebsite' ;
希望对您有所帮助!抱歉格式化,我意识到堆栈溢出 cmets 不是发布代码的最佳位置。
使用此方法时出现以下错误:FirebaseError: Function DocumentReference.update() 使用无效数据调用。无效的字段路径(externalLinks/网站)。路径不得包含 '~'、'*'、'/'、'[' 或 ']' 我按以下方式更新:this.db.collection('members').doc(uid).update(changes) ;【参考方案2】:
This question 提供了一个更新的解决方案,适用于 Cloud Firestore。
可以使用“.”,而不是使用“/”。而是:
var userRef = ref.child(hashedEmail);
var updateObject =
name: 'Rohan Dalvi',
"externalLinks.website": 'mywebsite'
;
userRef.update(updateObject);
【讨论】:
【参考方案3】:要更新 firebase 数据库中嵌套的 object
/map
/dictionary
,您可以使用 Firestore.Encoder
到 class
/struct
即 Codable
。
这是一个 Swift 代码示例:
型号:
import FirebaseFirestore
import FirebaseFirestoreSwift
// UserDetails Model
class UserDetailsModel: Codable
let name: String,
externalLinks: ExternalLinkModel
// UserDetails Model
class ExternalLinkModel: Codable
let website: String
调用 Firebase:
import FirebaseFirestore
import FirebaseFirestoreSwift
let firestoreEncoder = Firestore.Encoder()
let fields: [String: Any] = [
// using firestore encoder to convert object to firebase map
"externalLinks": try! firestoreEncoder.encode(externalLinkModel)
]
db.collection(path)
.document(userId)
.updateData(fields, completion: error in
...
)
【讨论】:
以上是关于更新嵌套对象 Firebase的主要内容,如果未能解决你的问题,请参考以下文章