如何在Cloud Firestore中将对象数组保存为Map格式?
把Firestore中的用户数组改为Map格式存储
嗨,我完全懂你的需求——你现在是把用户数据存成了数组,但想要改成Map(键值对字典)的格式,对吧?这个调整其实超简单,咱们直接看怎么改:
核心思路
原来你是把每个用户的字典放进数组,再存到Firestore里。要改成Map的话,只需要用用户的UserID作为键,把该用户的详情字典作为对应的值,这样存储后Firestore里就会是一个键值对的Map结构,而不是数组。
修改后的代码示例
首先,咱们把原来的数组换成字典(Map):
// 先创建单个用户字典(这部分和你原来的一样) var user1 = [String : Any]() var user2 = [String : Any]() var user3 = [String : Any]() user1.updateValue("UID1", forKey: "UserID") user1.updateValue("John", forKey: "fName") user1.updateValue("Smith", forKey: "lName") user2.updateValue("UID2", forKey: "UserID") user2.updateValue("John", forKey: "fName") user2.updateValue("Doe", forKey: "lName") user3.updateValue("UID3", forKey: "UserID") user3.updateValue("Jane", forKey: "fName") user3.updateValue("Doe", forKey: "lName") // 重点:创建Map(字典)而不是数组,用UserID作为键 var userDetailsMap = [String: [String: Any]]() userDetailsMap[user1["UserID"] as! String] = user1 userDetailsMap[user2["UserID"] as! String] = user2 userDetailsMap[user3["UserID"] as! String] = user3 // 保存到Firestore,用map代替原来的数组 startCompBatch.setData(["userDetails" : userDetailsMap], forDocument: doRef, merge: true)
更简洁的写法
如果你不想一步步创建单个用户再添加,也可以直接构建这个Map:
var userDetailsMap: [String: [String: Any]] = [ "UID1": ["UserID": "UID1", "fName": "John", "lName": "Smith"], "UID2": ["UserID": "UID2", "fName": "John", "lName": "Doe"], "UID3": ["UserID": "UID3", "fName": "Jane", "lName": "Doe"] ] startCompBatch.setData(["userDetails" : userDetailsMap], forDocument: doRef, merge: true)
这样做的好处
改成Map格式后,以后你要获取某个用户的详情时,直接用UserID作为键就能快速定位,不用遍历整个数组;而且Firestore对键值对的查询和更新也会更高效哦~
内容的提问来源于stack exchange,提问作者joffd
相关产品推荐
相关产品推荐

