2015-08-16 24 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()'在我寫這個答案時曾經是一種方法,它現在確實是一個只讀屬性。我更新了。 –