firestore 中按文档 id 直接获取(collection.doc(id).get())与通过字段值查询(collection.where('id', '==', id).get())在理论性能上完全一致,二者均基于索引、时间复杂度均为 o(1),实际差异可忽略;选择应优先考虑代码可读性与语义清晰度。
在 Firestore 中,通过文档 ID 直接读取(即使用 collection.doc(id).get())和通过等值查询字段获取单个文档(如 collection.where('id', '==', id).get())本质上都是利用底层 B-tree 索引进行精确匹配,其响应时间不随集合总文档数增长,而仅取决于返回结果数量——当两者都只返回 1 个文档时,理论延迟完全相同。
✅ 正确理解关键点:
? 实际验证建议(非必需,但可破除直觉误区):
若你观察到某一种方式“明显更慢”,大概率源于以下非核心因素,而非查询机制本身:

? 推荐实践(兼顾性能与工程健康):
// ✅ 推荐:语义清晰、API 直观、代码简洁
const docRef = db.collection('users').doc('user_123');
docRef.get().then((snap) => {
if (snap.exists) console.log(snap.data());
});
// ⚠️ 不推荐:冗余、易出错、语义模糊
db.collection('users')
.where('id', '==', 'user_123')
.get()
.then((snapshot) => {
const userDoc = snapshot.docs[0]; // 需手动处理空数组风险!
if (userDoc) console.log(userDoc.data());
});? 注意事项:
总结:你的“变慢感”几乎可以确定是主观印象或环境干扰所致。在功能等价的前提下,优先选用 collection.doc(id).get() —— 它更安全、更简洁、更符合 Firestore 的使用哲学。