根据属性检查firebase中的现有对象,防止重复

时间:2014-04-22 18:57:07

标签: javascript firebase single-page-application

我想查看我的firebase,看看我是否已经存储了一个匹配两个属性的对象。要将这个问题放到上下文中,想象一个只存储歌曲的应用程序,其中包含“艺术家”这样的属性。和'歌名'还有更多,像这样:

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

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

如果已存在具有相同艺术家和歌曲名称的对象,我想在此时阻止对象创建。我该如何检查?文档似乎没有为此提供示例,因为它们仅指出直接引用名称的情况。我的对象名称是自动生成的,我使用snapshot.name();在回调中读取它们。

我可以或者应该使用firebase后端的安全规则来执行此操作,还是已经在客户端检查它?

非常感谢任何线索:)!

2 个答案:

答案 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等于你的密钥并检查是否返回任何值。