【问题标题】:Move/Copy Firebase Object to Another Child Node将 Firebase 对象移动/复制到另一个子节点
【发布时间】:2017-08-20 16:33:05
【问题描述】:

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

结构是这样的:

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

由于应用的性质,我需要按性别区分用户。 如果用户更改了他们的性别,我想将他们的所有详细信息移至所选性别。

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

我想知道是否有更清洁或推荐的方法来做到这一点? 感谢任何人有任何指示或无论如何都可以提供帮助。

非常感谢, 诺埃尔

【问题讨论】:

    标签: angularjs firebase ionic-framework angularfire


    【解决方案1】:

    其实很简单

        // 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);
        });
    

    【讨论】:

    • 描述是从哪里来的?
    • 但是移动的时候会不会删除原来的记录?
    【解决方案2】:

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

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

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

    查询和向每个用户添加额外数据也更加灵活。

    我可能不适用于这个用例,但总体而言这是最佳实践。

    【讨论】:

      【解决方案3】:

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

      我将发布用于复制和清理的代码,可能对某人有所帮助。我遇到了“开启”监听器的问题,它正在删除两个节点。将此更改为“一次”即可解决。

      // 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);
          });
      

      【讨论】:

      • 派对迟到了,但这应该是一个答案还是应该成为您问题的一部分?
      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多