将Firebase对象移动/复制到另一个子节点

时间:2017-03-27 19:58:02

标签: angularjs firebase ionic-framework angularfire

我在firebase中有一个用户对象,我需要移动到同一棵树上的另一个子节点。

结构如下:

users -> male   -> uid -> ......KVPs..objects...etc
      -> female -> uid -> ......KVPs..objects...etc

由于应用的性质,我需要让用户按性别分开。 如果用户更改了其性别,我希望将所有详细信息移至所选的性别。

我尝试使用AngularFire(firebaseObject),但是当我尝试在firebase中设置它时,由于对象中存在键,它会抛出错误。我尝试使用JSON.stringify,angular.toJSON去除键,但是没有运气!!

我想知道有更清洁或推荐的方法吗? 欣赏如果有人有任何指示或无论如何都可以提供帮助。

非常感谢, 诺尔

3 个答案:

答案 0 :(得分:4)

这实际上非常简单

    // firebase ref
    desc.ref1 = new Firebase(desc.userRef+'/'+desc.oldGender+'/'+uid);
    desc.ref2 = new Firebase(desc.userRef+'/'+desc.gender+'/'+uid);

    desc.ref1.on("value", function(snapshot) {
        console.log(snapshot.val());

        desc.ref2.set(snapshot.val());

    }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
    });

答案 1 :(得分:0)

我实际上建议更改结构而不是移动节点

users
  uid_0
    name: "some name"
    gender: "male"
    loc: "US"
  uid_1
    name: "another name"
    gender: "female"
    loc: "FR"

它仍然提供性别分离,但更灵活地更改名称,性别,位置或其他任何内容,而无需阅读,删除和重写现有数据。

对于查询以及向每个用户添加其他数据,它也更加灵活。

我可能不会为这个用例工作,但从大图来看这是最好的做法。

答案 2 :(得分:0)

感谢您的回复。我原来是这样的,我仍然在UID下捕获性别,但我想分开男性和女性。我的应用程序用于约会,所以我认为根据首选的性别属性进行搜索会更有效率。我认为最初搜索的节点减少了约50%。如果您对此有一些建议,我很乐意听到,因为我对firebase / JSON的性能最佳实践不太了解。

我要发布用于复制和清理的代码,因为这可能对某人有帮助。我在' on'监听器,它正在删除两个节点。将此更改为'一次'解决了它。

// firebase refs
    desc.ref1 = new Firebase(desc.userRef+'/'+desc.oldGender+'/'+uid);
    desc.ref2 = new Firebase(desc.userRef+'/'+desc.gender+'/'+uid);

// copy user object
    desc.ref1.once("value", function(snapshot) {

        // copy user data to new gender tree
        desc.ref2.set(snapshot.val(), function(error) {
            if (error) {
                $log.info("could not copy user object." + error);
            } else {
                $log.info("user object copied successfully.");

                // remove user object under old gender
                desc.ref1.remove(desc.onComplete);
            }
        });
    }, function (errorObject) {
        $log.info("The read failed: " + errorObject.code);
    });