更新嵌套对象firebase

时间:2015-11-18 15:59:53

标签: javascript angularjs firebase

来自Firebase说明:

给定var loader = new THREE.OBJMTLLoader(); loader.load(objModel, mtlModel, function(object) { object.position.x = 20; object.position.y = -20; object.position.z = -100; object.scale.set(10, 10, 10); object.matrixAutoUpdate = false; object.updateMatrix(); var testMat; object.traverse( function ( child ) { var object3d = child; if(object3d instanceof THREE.Mesh){ testMat = new THREE.ShaderMaterial(); testMat.copy(object3d.material); object3d.material = testMat; object3d.geometry.computeFaceNormals(); object3d.geometry.computeTangents(); object3d.geometry.computeBoundingSphere(); } }); }); 之类的单一关键路径,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!");
                }
            });
        });
    }

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

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

2 个答案:

答案 0 :(得分:12)

您可以使用多路径更新

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

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

答案 1 :(得分:6)

This question提供了适用于Cloud Firestore的最新解决方案。

除了使用“ /”,还可以使用“。”代替:

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