更新嵌套对象firebase

Roh*_*lvi 9 javascript angularjs firebase

从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!");
                }
            });
        });
    }
Run Code Online (Sandbox Code Playgroud)

所以,如果我通过:

{
   name: 'Rohan Dalvi', 
   externalLinks: { 
      website: 'mywebsite'
   }
}
Run Code Online (Sandbox Code Playgroud)

然后它将删除externalLinks对象中的其他属性.是否有更简洁的方法来避免这种情况?

简而言之,我如何确保仅更新嵌套对象并且不删除数据.

Dav*_*ast 14

您可以使用多路径更新.

var userRef = ref.child(hashedEmail);
var updateObject = {
   name: 'Rohan Dalvi', 
   "externalLinks/website": 'mywebsite'
};
userRef.update(updateObject);
Run Code Online (Sandbox Code Playgroud)

通过使用"externalLinks/website"对象文字中的语法,它将嵌套路径视为更新,而不是嵌套对象的集合.这样可以防止嵌套数据被删除.

  • @OliverDixon 使用 ES6,您可以使用计算属性名称,如下所示:```js const dynamicProperty = 'foo'; const updateObject = { name: 'Rohan Dalvi', [dynamicProperty]: 'mywebsite' }; ``` 你也可以像这样将静态字符串和动态部分结合起来:```js const updateObject = { name: 'Rohan Dalvi', [`externalLinks/${dynamicProperty}`]: 'mywebsite' }; ``我希望有帮助!抱歉格式化,我意识到堆栈溢出注释不是发布代码的最佳位置。 (3认同)
  • 使用此方法时出现以下错误:FirebaseError:使用无效数据调用函数 DocumentReference.update()。字段路径无效(externalLinks/网站)。路径不得包含 '~'、'*'、'/'、'[' 或 ']' 我按以下方式更新: this.db.collection('members').doc(uid).update(changes) ; (2认同)

D W*_*D W 9

这个问题提供了一个适用于 cloud firestore 的最新解决方案。

可以使用“.”而不是“/”。反而:

var userRef = ref.child(hashedEmail);
var updateObject = {
   name: 'Rohan Dalvi', 
   "externalLinks.website": 'mywebsite'
};
userRef.update(updateObject);
Run Code Online (Sandbox Code Playgroud)