2016-12-30 111 views
7

状态:如何将childNode从一个节点复制到另一个节点?

我需要下载childNode,然后将其设置()到另一个节点。

问题是,我想这样做,只有当childNode的得分属性达到100

在哪里,当我要检查,如果职位有100分以上,我将如何把它们复制到新的索引只一次?


我的思考:

当一个岗位被加载时,检查它的得分。如果它大于等于100,检查数据库是否属于这种情况。然后将节点推送到新索引。


问题:

我将如何防止各个因为它的得分是> = 100多个负载的帖子被加载时被上载的节点?我需要它只发生一次!


解决方案代码:

if (funPost.score >= global.hotNumber && funPost.hot == false) { 
      var hotPostRef = firebase.database().ref("hot/section/"+key); 
      var hotPost = { 
       title: funPost.title, 
       image: funPost.image, 
       id: funPost.id, 
       key: funPost.key 
      } 
      hotPostRef.set(hotPost); 
      funPostRef.update({"hot": true}); 
     } 
    else if (funPost.score <= (global.hotNumber - 25) && funPost.hot == true) { 
     var hotPostRef = firebase.database().ref("hot/section/"+key); 
     hotPostRef.remove(); 
     funPostRef.update({"hot": false}); 
    } 

解决方法:最后我用一个布尔标志。

+2

当您读取数据时,您似乎正在构建'> = 100'索引。是否有一个原因?您是否在编写数据时考虑构建索引?你有没有理由不能?这样做是相对直接的。 – cartant

+0

如果您将观察者添加到包含乐谱的节点,它会在更新后通知您的应用。因此,当它通知您的应用程序时,检查它是否为100,如果是,请下载节点,将得分设为0并执行复制。如果这是一笔交易,您可以简单地让您的应用程序检查包含node/should_observe:true的首选项节点,并且只在观察分数节点(如果为真),如果为false,不添加观察者。然而,下载整个节点并写回它似乎是过度杀伤性的。你为什么这样做? – Jay

+0

@Jay如果你看看我的res.render(),你会看到我正在传递整个帖子来显示下一页的信息。但一切都很好:我最终使用了一个布尔标志。今晚将发布我的代码。 – Coder1000

回答

1

我结束了一个布尔标志,这样做:

if (funPost.score >= global.hotNumber && funPost.hot == false) { 
      var hotPostRef = firebase.database().ref("hot/section/"+key); 
      var hotPost = { 
       title: funPost.title, 
       image: funPost.image, 
       id: funPost.id, 
       key: funPost.key 
      } 
      hotPostRef.set(hotPost); 
      funPostRef.update({"hot": true}); 
     } 
    else if (funPost.score <= (global.hotNumber - 25) && funPost.hot == true) { 
     var hotPostRef = firebase.database().ref("hot/section/"+key); 
     hotPostRef.remove(); 
     funPostRef.update({"hot": false}); 
    } 
0

尝试使用.once() insted .on()

ref.once('value') 
     .then(function(dataSnapshot) { 
     // handle read data. 
    }); 
+0

这正是我已经想到的。但每次页面加载时都会触发它。 – Coder1000

+1

你能提供一段代码来检查它吗? –

+0

在服务器端,加载页面时,帖子的分数也是如此。如果分数大于等于100,则将帖子设置到新位置。通常情况下,我会使用布尔标志来确保这只发生一次,但我不知道我会在哪里放置它:/ – Coder1000

-1

https://gist.github.com/katowulf/6099042 是如何复制或移动裁判另一个REF。

我将如何防止从每个职位是 加载,因为它的得分是在多个负载> = 100时被上载的节点?我需要它到 只发生一次!

1)如果路径键已经存在()在新位置中,则使用螺栓规则使写入失败。

2)导致分数升高的原因是什么?例如调查完成,考试已完成 这些事件应发送到firebase队列,可以运行一系列管道来更新您需要的任何内容。