我在测试数据库中创建了一些包含许多文档的集合,然后针对它运行 COUNT() 查询。
通过 Node.js Admin SDK 生成最小文档的代码:
const db = getFirestore();
const col = db.collection("10m");
let count = 0;
const writer = db.bulkWriter();
while (count++ < 10_000_000) {
if (count % 1000 === 0) await writer.flush();
writer.create(col.doc(), {
index: count,
createdAt: FieldValue.serverTimestamp()
})
}
await writer.close();
然后我用:
for (const colName of ["1k", "10k", "1m", "10m"]) {
const start = Date.now();
const result = await getCountFromServer(query(collection(db, colName), limit(7_500_000)));
console.log(`Collection '${colName}' contains ${result.data().count} docs (counting took ${Date.now()-start}ms)`);
}
我得到的结果是:
| count |
ms |
| 1,000 |
120 |
| 10,000 |
236 |
| 100,000 |
401 |
| 1,000,000 |
1,814 |
| 10,000,000 |
16,565 |
我运行了一些带有限制和条件的额外测试,结果始终与上面计算的结果数一致。因此,例如,计算 1000 万文档的集合的 10% 大约需要 1.5 到 2 秒。
因此,基于此,在达到 60 秒超时之前,您最多可以计算 40m 左右的文档。老实说,考虑到每计算 1,000 个文档,您需要支付 1 个文档读取费用,您可能希望在此之前切换到存储的 counters。