You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算Firestore查询/where操作的读写次数?

如何计算Firestore查询/where操作的读写次数?

我来帮你把Firestore查询的计费逻辑讲明白,这也是很多刚上手Firestore的开发者容易懵的点~

读取次数的核心规则

Firestore对查询操作的读取计费,完全基于实际返回给你的文档数量,和你用了多少个where过滤条件、过滤掉了多少无关文档没有关系。

举个例子,你用where('capital', '==', true)查询城市集合,假设最终返回了5个符合条件的文档,那这次查询就会消耗5次读取次数;如果没有匹配到任何文档,那这次查询不会产生读取费用。

不同场景下的读取次数计算

  • 单次get()查询:就是上面说的,返回N个文档算N次读取。比如你贴的代码示例:
    var citiesRef = db.collection('cities');
    var query = citiesRef.where('capital', '==', true).get()
      .then(snapshot => {
        snapshot.forEach(doc => {
          console.log(doc.id, '=>', doc.data());
        });
      })
    
    如果snapshot里有3个文档,那就是3次读取。
  • 实时监听(onSnapshot
    • 第一次建立监听时,会返回所有匹配的文档,这部分按返回的文档数算读取次数;
    • 之后只有当匹配的文档发生变化(新增、修改、删除)时,才会针对变化的那个文档算1次读取(如果修改后的文档仍然符合查询条件的话)。
  • 分页查询:用limit()startAfter()做分页时,每一次分页请求返回的文档数,就是那次请求的读取次数。比如每页取10个文档,第一次请求算10次,第二次请求如果返回8个,就算8次。
  • 缓存读取:如果文档已经在本地缓存中,从缓存读取不会产生服务器读取费用,只有从云端拉取的文档才会计费。

写入次数的相关说明

where查询本身是读取操作,不会产生写入费用。只有当你在查询之后对文档执行更新、删除、新增操作时,才会产生写入次数:

  • 每个被修改/删除的文档,算1次写入;
  • 新增一个文档,算1次写入;
  • 批量操作(batch())只是合并网络请求,每个操作仍然单独计费,比如批量更新5个文档,还是算5次写入。

额外提醒

  • 复合索引的使用会产生存储费用,但不会影响读写次数的计算;
  • 如果你的查询需要复合索引但没有创建,Firebase控制台会提示你创建链接,记得及时处理,不然查询会失败。

内容的提问来源于stack exchange,提问作者Andy Fusniak

火山引擎 最新活动