Firebase update()不是带有查询

时间:2017-07-12 03:04:37

标签: javascript angularjs firebase firebase-realtime-database

我尝试使用AngularJS更新Firebase数据库中的记录中的属性。我可以设置一个查询来查找我的记录:

  firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value')
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      console.log(childSnapshot.val())
    });
  })

如果我在记录密钥中进行硬编码,我可以更新我的财产:

firebase.database().ref('en/-KloeQHDC-mugPjJMAG4').update({ wordFrequency: 111 })

但是,如果我设置查询以查找记录然后更新它,我会收到一条错误消息update is not a function

firebase.database().ref('en/').orderByChild('word').equalTo('the').update({ wordFrequency: 9001 })

另一个answer建议在update()循环内调用forEach

  firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value')
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      console.log(childSnapshot.val()); // this works
      childSnapshot.ref().update({ wordFrequency: 9001 });
    });
  });

返回错误消息TypeError: childSnapshot.ref is not a function。我不知道childSnapshot如何成为Firebase参考号。

另一个answer

  

当您在某个位置调用update()时,Firebase会循环访问数据   您传入(在您的情况下为json)并且每个键执行一次   ref.child(键).SET(值)。

如果update()遍历数据,我为什么要从update()循环内调用forEachdocumentation无法在update()循环内显示调用forEach

2 个答案:

答案 0 :(得分:2)

Firebase数据库SDK提供了Reference.update()方法来更新数据库中单个位置的数据。这里的关键是Reference是数据库中的单个位置,因此很清楚要更新的内容。

关于多路径更新如何工作的伪代码说明适用于数据库服务器如何实现它:给定一个位置/ DatabaseReference它基于此更新update()调用中的每个路径。

Query可以匹配数据库中的多个位置,因此它没有update()方法(或者set()remove()

要更新查询匹配的每个位置,请执行查询,然后在每个结果上调用update() - 通过child_added侦听器或value侦听器和循环就像在你的最后一个片段中一样。

答案 1 :(得分:1)

我发布这个问题后,我走了狗,吃了晚餐,然后解决方案来找我。我的新规则是,“Firebase查询的关键是跟踪密钥。”

此模板供用户更新数据库中的记录。他们在表单域中输入搜索词,然后单击“搜索”按钮。 $scope.search处理程序查询Firebase数据库,然后使用记录的属性填充表单字段:

  $scope.search = function() {
    myFirebase_ref.orderByChild('word').equalTo($scope.word).once('value')
    .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      $scope.wordKey = childSnapshot.key;
      $scope.audioArray = childSnapshot.val().audio;
      $scope.ipaArray = childSnapshot.val().ipa;
      $scope.language = childSnapshot.val().language;
      $scope.longLanguage = childSnapshot.val().longLanguage;
      $scope.phonemeArray = childSnapshot.val().phonemes;
      $scope.translationArray = childSnapshot.val().translations;
      $scope.word = childSnapshot.val().word;
      $scope.wordFrequency = childSnapshot.val().wordFrequency;
      $scope.$apply();
    });
  })
  .catch(function(error) {
    console.error("Authentication failed:", error.message);
  });
};

请注意,在属性分配的顶部,我有$scope.wordKey = childSnapshot.key;。我正在跟踪记录的关键。

然后用户更新字段。每个字段旁边都有一个按钮,用于“更新”。每个按钮都转到一个处理程序。例如,要更新wordFrequency字段,我有这个处理程序:

$scope.updateFrequencyRank = function() {
  firebase.database().ref('en/' + $scope.wordKey).update({ wordFrequency: $scope.wordFrequency })
};

一行代码,它的工作原理!更好的是,我创建了一个onComplete函数来告诉我更新是否成功:

$scope.updateFrequencyRank = function() {

  var onComplete = function(error) {
    if (error) {
      console.log('Update failed');
    } else {
      console.log('Update succeeded');
    }
  };

  firebase.database().ref('en/' + $scope.wordKey).update({ wordFrequency: $scope.wordFrequency }, onComplete);
};