【发布时间】:2017-05-15 02:00:49
【问题描述】:
情况:
我需要下载 childNode,然后将它 set() 到另一个节点中。
问题是我只想在 childNode 的 score 属性达到 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});
}
解决方案:我最终使用了一个布尔标志。
【问题讨论】:
-
当您读取数据时,您似乎正在构建
>= 100索引。是否有一个原因?写数据的时候有没有考虑过建索引?你不能有理由吗?这样做相对简单。 -
如果您向包含分数的节点添加观察者,它会在更新时通知您的应用。因此,当它通知您的应用程序时,检查它是否为 100,如果是,则下载节点,分数为 0 并执行复制。如果这是一次性交易,您可以简单地让您的应用程序检查一个包含节点 /should_observe: true 的首选项节点,如果为真,则仅观察分数节点,如果为假,则不要添加观察者。但是,下载整个节点并将其写回似乎有点矫枉过正。你为什么这样做?
-
@Jay 如果您查看我的 res.render(),您会看到我正在传递整个帖子以在下一页显示信息。但一切都很好:我最终使用了一个布尔标志。今晚将发布我的代码。
-
@cartant 我想过。但是我写数据的那一刻是在客户端生成的。我更喜欢隐藏算法以在我的服务器代码的顶部获取帖子。因此我为什么要检查负载:)
标签: javascript node.js firebase firebase-realtime-database