如何计算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




