繁体   English   中英

基于一组已知键向 Firebase 数据库发出批量请求的最有效方法是什么?

[英]What is the most efficient way to make a batch request to a Firebase DB based on an array of known keys?

我需要一种解决方案,该解决方案可以根据键对多个项目进行 Firebase DB API 调用,并返回这些键的数据(子项)(在一个响应中)。

由于我不需要实时数据,某种标准的 REST 调用一次(而不是 Firebase DB 侦听器),我认为这将是理想的。

该应用程序不会再打开另一个侦听器和 WebSocket 连接。 但是,我查看了 Firebase 的 API 文档,但似乎没有办法做到这一点。

我见过的大多数答案总是建议创建某种类型的复合键/索引并使用复合键进行相应的过滤,但这仅适用于搜索范围。 或者他们建议只嵌套数据而不用担心冗余和磁盘空间(而且速度更快),而不是通过外键检索关联数据。

但是,问题是我使用的是 Geofire,它的查询方法只返回项目的键,而不是项目的数据。 所有文档和以前的答案都建议通过实时 SDK 检索数据,我已经尝试使用once方法或对所有项目进行 REST 调用并使用orderBystartAtendAt参数进行过滤并通过本地过滤我需要的钥匙。

这可以工作,但检索一堆我不需要的项目的潜在开销只是在本地过滤掉它们似乎很浪费。 使用once侦听器的方法似乎也很浪费,因为它是每个项目键的服务器往返。 这种方法在这篇相当不错的帖子中得到了解释,但根据这个解释,它仍然为每个项目进行往返(即使它是异步的并通过相同的连接)。

这个可怜的灵魂问了一个类似的问题,但没有得到很多有用的答复(这确实解决了发出n个服务器请求的成本)。

有人可以一劳永逸地解释如何做到这一点的方法以及利弊吗? 谢谢。

我需要一个解决方案,该解决方案可以根据键对多个项目进行 Firebase DB API 调用,并返回这些键的数据(子项)(在一个响应中)。

一种解决方案可能是设置一个单独的服务器来向 Firebase 服务器发出您需要的所有调用,将它们聚合起来,然后将其作为一个响应发回。

有工具可以做到这一点。

Facebook 团队最近指定的一种更流行的方法是 GraphQL。 https://graphql.org/

在幕后,你设置你的 graphql 服务器来映射你的查询,这些查询都会进行单独的 API 调用来获取你需要的数据以适应查询。 一旦所有 API 调用完成,graphql 就会以 JSON 对象的形式将其作为响应发回。

看起来您正在寻找Cloud Functions 您可以创建一个从 http 请求调用的函数并在其中读取每个数据库。

这些函数在云端执行,它们的结果被发送回调用者。 HTTP 调用是触发 Cloud Functions 函数的一种方式,但您可以设置其他方法(调度、来自具有 Firebase SDK 的应用程序、数据库触发器...)。 数据在离开服务器之前不会收费(因此仅在您的请求响应中或如果您请求另一个区域的数据库)。 Cloud Function 计费基于使用的 CPU、调用次数和运行实例,配额部分的更多详细信息。

你会得到类似的东西:

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

exports.getAllNodes = functions.https.onRequest((req, res) => {
  
  let children = [ ... ]; // get your node list from req
  let promises = [];

  for (const i in children) {
    promises.push(database.ref(children[i]).once('value'));
  }

  Promise.all(promises)
    .then(result => {
      res.status(200).send(result);
    })
    .catch(error => {
      res.status(503).send(error);
    });
});

您必须使用 firebase CLI 进行部署。

这就是您如何在javascript 中一次性调用文档,希望它有所帮助

 // Get a reference to the database service
 let database = firebase.database();
 // one time call to a document
 database.ref("users").child("demo").get().then((snapshot) => {
     console.log("value of users->demo-> is", snapshot.node_.value_)
 });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM