我想查看我的firebase,看看我是否已经存储了一个匹配两个属性的对象。要将这个问题放到上下文中,想象一个只存储歌曲的应用程序,其中包含“艺术家”这样的属性。和'歌名'还有更多,像这样:
var wishlist = new Firebase('https://myurl.firebaseio.com/wishes');
wishlist.push({
'artist': artist,
'song': song,
'likes': 0
});
如果已存在具有相同艺术家和歌曲名称的对象,我想在此时阻止对象创建。我该如何检查?文档似乎没有为此提供示例,因为它们仅指出直接引用名称的情况。我的对象名称是自动生成的,我使用snapshot.name();
在回调中读取它们。
我可以或者应该使用firebase后端的安全规则来执行此操作,还是已经在客户端检查它?
非常感谢任何线索:)!
答案 0 :(得分: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() );
});
}
答案 1 :(得分:2)
如果你想要一些独特的东西,显而易见的解决方案就是将它们作为关键......
但是如果你想要两个键,我相信你可以使用'priority'作为辅助键(虽然不是自动唯一)。因此,如果您使用您的艺术家+歌曲作为每个记录的prioirty,您可以检查它是否已经存在: -
使用startat和limit(以限制为1启动密钥,检查返回的记录值) 或者使用startat和endat等于你的密钥并检查是否返回任何值。