【问题标题】:Check firebase for an existing object based on attributes, prevent duplicates根据属性检查现有对象的firebase,防止重复
【发布时间】:2014-04-22 18:57:06
【问题描述】:

我想检查我的 Firebase,看看我是否已经存储了一个匹配两个属性的对象。为了把这个问题放在上下文中,想象一个只存储歌曲的应用程序,具有“艺术家”和“歌曲名”等属性,如下所示:

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

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

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

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

非常感谢任何线索:)!

【问题讨论】:

    标签: javascript firebase single-page-application


    【解决方案1】:

    为每个条目存储一个索引,如下所示:

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

    【讨论】:

    • 您必须在 Firebase 规则中进行哪些更改才能允许这样做?你能把它们保留为.write: true吗?
    【解决方案2】:

    如果你想要一些独特的东西,显而易见的解决方案是使用它们作为关键......

    但是,如果您想要两个键,我相信您可以使用“优先级”作为辅助键(虽然不会自动唯一)。因此,如果您使用您的艺术家+歌曲作为每条记录的优先级,您可以检查它是否已经存在:-

    使用 startat 和 limit (startat 你的 key 限制为 1,检查返回的记录值) 或者可能使用 startat 和 endat 等于您的密钥并检查是否返回任何值。

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 2013-12-26
      • 2014-05-08
      • 1970-01-01
      • 2017-10-09
      • 2023-03-15
      • 2022-01-10
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多