【问题标题】:Firebase - Update entry where value isFirebase - 更新值为的条目
【发布时间】:2015-08-16 10:09:19
【问题描述】:

如何获取 Firebase 唯一 ID,以便可以使用它来引用特定条目?

我正在使用push方法存储一些数据,每个条目包含一个weekNumber和year。我检查是否已经存在 weekNumber,如果存在,我需要更新 foo 和 bar。检查 weekNumber 是否存在没有问题,但我不知道如何更新其他字段。

示例数据结构:

- ENTRIES
 - USER
  -JwphpyzzHaNlh8HXA2G
   foo: 'string'
   bar: 'string'
   weekNumber: 32
   year: 2015

  -Jwphpyzzaasd2H2DHB
   foo: 'string'
   bar: 'string'
   weekNumber: 33
   year: 2015

检查 weekNumber 是否存在:

ref.orderByChild('weekNumber').equalTo(data.weekNumber)
   .on('value', function(result) {

   });

我尝试使用 result.key() 或 result.parent(),但两者都返回路径 ENTRIES/USER 而不是唯一的 FB 键。

【问题讨论】:

    标签: angularjs firebase


    【解决方案1】:

    使用您当前的数据结构,您可以通过以下方式获取数据:

    var query = ref.orderByChild('weekNumber').equalTo(data.weekNumber)
    query.on('value', function(snapshot) {
        snapshot.forEach(function(weekSnapshot) {
            console.log(weekSnapshot.val());
            weekSnapshot.ref.update({ foo: 'newString' });
        });
    });
    

    但我会考虑不同的数据结构。

    Firebase 的 push() 非常适合项目没有自然键的集合,类似于在 JavaScript 中将它们放入数组中的方式。

    但是在您的情况下,这些项目具有自然键。看起来您正在尝试按年+周访问项目,这(从查看示例数据来看)似乎是一年中一周的一个非常独特的标识符。

    在这种情况下,我会将数据存储在 year+week 键下:

    - ENTRIES
     - USER
      "201532"
       foo: 'string'
       bar: 'string'
       weekNumber: 32
       year: 2015
    
      "201533"
       foo: 'string'
       bar: 'string'
       weekNumber: 33
       year: 2015
    

    通过这样的结构,您可以直接访问特定的周/年:

    ref.child('2015' + data.weekNumber).on('value', function(snapshot) {
        console.log(snapshot.val());
        snapshot.ref.update({ foo: 'newString' });
    });
    

    但您仍然可以使用以下任一方法查询年份:

    // this will print all weeks of 2015
    var query = ref.orderByKey().startAt('2015').endAt('201553');
    query.on('child_added', function(snapshot) {
        console.log(snapshot.val());
    });
    

    甚至每年的特定星期:

    // this will print week 33 of each available year
    var query = ref.orderByChild('weekNumber').equalTo('33');
    query.on('child_added', function(snapshot) {
        console.log(snapshot.val());
    });
    

    【讨论】:

    • Thnxs,在写完这个问题后,我已经开始考虑重组数据,因为我更多地关注了 firebase 的 .set 与 .push 功能。但我仍然想知道如何使用唯一标识符,我将在其他地方需要它。
    • 在你上面的例子中,我相信ref 是一个属性,而不是一个方法。换句话说,它应该是snapshot.ref 而不是snapshot.ref()。我不确定这是否在较新版本的 Firebase 中发生了变化,但我最近遇到了这个问题。
    • 感谢您的反馈。 DataSnapshot.ref() 曾经是我写这个答案时的一种方法,现在它确实是一个只读属性。我更新了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多