2014-04-22 79 views
2

我想檢查我的Firebase,看看是否已存儲匹配兩個屬性的對象。爲了把這個問題的來龍去脈,想象一個應用程序,只是存儲的歌曲,有像「藝術家」和「SONGNAME」和更多一些,像這樣的屬性:根據屬性檢查現有對象的Firebase,防止重複

var wishlist = new Firebase('https://myurl.firebaseio.com/wishes'); 

wishlist.push({ 
    'artist': artist, 
    'song': song, 
    'likes': 0 
}); 

我想防止如果此時對象的創建具有相同藝術家和歌曲名的對象已經存在。我該如何檢查?文檔似乎沒有提供這樣的例子,因爲它們只指出直接引用名稱的案例。我的對象名稱是自動生成的,我在snapshot.name();的回調中讀取它們。

可以或應該使用firebase後端中的安全規則來做到這一點,還是應該在客戶端檢查它?

非常感謝任何線索:)!

回答

3

商店的東西,如下面的每個條目索引:

/wishes/$wishid/ (song, artist) 
/wish_index/$hash/$wishid 

使用hash algorithm創建$hash

var fb = new Firebase(URL); 

function saveWishEntry(song, artist) { 
    var wishRef = fb.child('wishes').push(); 
    wishRef.set({ 
    song: song, artist: artist, likes: 0 
    }, function(err) { 
    if(err) throw err; 
    saveWishIndex(wishRef.name(), song, artist); 
    }) 
} 

function saveWishIndex(key, song, artist) { 
    // http://phpjs.org/functions/md5/ 
    var hash = MD5(song)+':'+MD5(artist); 
    fb.child('wish_index/'+hash).set(key); 
} 

現在,當你想知道,如果一個記錄存在,只是看它在指數中:

// callback will be passed either a {string}key or null(not found) 
function wishId(song, artist, callback) { 
    fb.child('wish_index/'+hash).once('value', function(snap) { 
     callback(snap.val()); 
    }); 
} 
+0

什麼是您必須更改您的Firebase規則以允許這個?你可以把它們保存爲'.write:true'嗎? –

2

如果你想要的東西是獨一無二的,明顯的解決辦法是把它們作爲關鍵...

但是如果你想要兩個鍵,我相信你可以使用「優先」作爲第二個鍵(不是自動唯一的)。因此,如果您使用您的藝術家+歌曲作爲您的prioirty的每條記錄,則可以檢查它是否已經存在:

使用startat和limit(以限制1開始您的密鑰,檢查返回的記錄值) 或者可以使用startat和endat等於你的密鑰,並檢查是否有任何值返回。