gpt4 book ai didi

database - 在 Firebase 中,有没有办法在不加载所有节点数据的情况下获取节点的子节点数?

转载 作者:太空狗 更新时间:2023-10-30 01:37:03 26 4
gpt4 key购买 nike

您可以通过

获取 child 数量
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });

但我相信这会从服务器获取该节点的整个子树。对于巨大的列表,这似乎是 RAM 和延迟密集型的。有没有办法在不获取整个内容的情况下获取计数(和/或子名列表)?

最佳答案

您提供的代码片段确实加载了整个数据集,然后在客户端对其进行计数,这对于大量数据来说可能非常慢。

Firebase 目前无法在不加载数据的情况下计算 child 数量,但我们确实计划添加它。

目前,一种解决方案是维护子项数量的计数器,并在每次添加新子项时更新它。您可以使用事务来计算项目,就像在跟踪更新的代码中一样:

var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes');
upvotesRef.transaction(function (current_value) {
return (current_value || 0) + 1;
});

有关详细信息,请参阅 https://www.firebase.com/docs/transactions.html

更新:Firebase 最近发布了 Cloud Functions。使用 Cloud Functions,您无需创建自己的服务器。您可以简单地编写 JavaScript 函数并将其上传到 Firebase。 Firebase 将负责在事件发生时触发函数。

例如,如果你想计算赞成票,你应该创建一个类似于这个的结构:

{
"posts" : {
"-JRHTHaIs-jNPLXOQivY" : {
"upvotes_count":5,
"upvotes" : {
"userX" : true,
"userY" : true,
"userZ" : true,
...
}
}
}
}

然后编写一个 javascript 函数,当有新的写入 upvotes 节点时增加 upvotes_count

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.countlikes = functions.database.ref('/posts/$postid/upvotes').onWrite(event => {
return event.data.ref.parent.child('upvotes_count').set(event.data.numChildren());
});

您可以阅读 Documentation知道如何Get Started with Cloud Functions .

此外,这里还有另一个计数帖子的示例: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js

2018 年 1 月更新

firebase docs已经更改,所以我们现在有 changecontext 而不是 event

给定的示例抛出一个错误,提示 event.data 未定义。这种模式似乎效果更好:

exports.countPrescriptions = functions.database.ref(`/prescriptions`).onWrite((change, context) => {
const data = change.after.val();
const count = Object.keys(data).length;
return change.after.ref.child('_count').set(count);
});

```

关于database - 在 Firebase 中,有没有办法在不加载所有节点数据的情况下获取节点的子节点数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com