2015-08-16 23 views
0

如何获取Firebase唯一ID,以便我可以使用它来引用特定条目?Firebase - 更新条目,其中值为

我使用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(),但都返回路径条目/ USER而不是唯一的FB键。

回答

2

根据您当前的数据结构,你可以得到的数据:

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中的数组。

但在你的情况下,项目有一个自然的关键。它看起来像你试图访问年份+周的项目,这(从看样本数据)看起来像一年中一个星期的唯一标识符。

在这种情况下,我想将数据存储下一年+周键:

- 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' }); 
}); 
甚至在每个Y特定周

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

Thnxs在写完这个问题后,我已经开始考虑重构数据,因为我更多地关注了firebase的.set vs .push功能。但我仍然想知道如何使用唯一标识符,我会在其他地方需要它。 – LazyAdmin

+0

在你上面的例子中,我相信'ref'是一个属性,而不是一个方法。换句话说,它应该是'snapshot.ref'而不是'snapshot.ref()'。我不确定这是否在更新版本的Firebase中发生了变化,但最近我遇到了这个问题。 – Andi

+0

感谢您的反馈。 'DataSnapshot.ref()'在我写这个答案时曾经是一种方法,它现在确实是一个只读属性。我更新了。 –