【问题标题】:Updating nested objects firebase更新嵌套对象 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,谢谢它有效!虽然我没有尝试更新嵌套对象中的数组。

标签: javascript angularjs firebase


【解决方案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.Encoderclass/structCodable

    这是一个 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
                 ...
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2020-10-05
      • 2021-11-27
      • 2015-06-25
      相关资源
      最近更新 更多