Firestore如何通过指定文档ID查询获取对应文档数据
问题
我的数据库设计如下图所示:
我想知道怎么用类似KeXrsroFOeMs4XNjgC7h这类ID检索对应文档的取值,目前我写的代码如下,运行达不到预期:
db.collection('users',).where(id, '==', id) .get().then(function(querySnapshot) { if (querySnapshot.size > 0) { // Contents of first document resolve(querySnapshot.docs[0].data()); } else { resolve("No such document!"); } }) .catch(function(error) { console.log("Error getting document: ", error); });
回答
你这段代码写错了核心逻辑:
- 你提到的
KeXrsroFOeMs4XNjgC7h是Firestore自动生成的文档ID,也就是文档在集合下的唯一主键,不是文档里存储的普通字段,不需要用where做条件查询,直接定位单文档查询效率高得多。 - 你写的
where(id, '==', id)本身就有语法问题:where的第一个参数必须是字段名字符串或者内置的文档ID字段标识,你直接传未定义的变量id根本匹配不到任何内容。
正确写法(官方推荐,按文档ID直查)
直接调用doc()方法指定要查询的文档ID,拿到文档快照后先判断是否存在,再取数据即可:
// 替换成你实际要查询的目标ID const docId = "KeXrsroFOeMs4XNjgC7h"; db.collection("users").doc(docId).get() .then(snapshot => { if (snapshot.exists) { // 这里就是你要的文档内容 const result = snapshot.data(); resolve(result); } else { resolve("No such document!"); } }) .catch(err => { console.log("Error getting document: ", err); });
特殊场景:必须用where查询匹配文档ID
如果你有批量查询多个指定ID文档的需求,才需要用where搭配内置的documentId()标识来匹配,单ID查询完全没必要用这种方式:
// 注意:不同SDK版本引入路径略有区别,Web SDK v9+需要单独引入documentId const q = db.collection("users").where(firebase.firestore.FieldPath.documentId(), "==", "KeXrsroFOeMs4XNjgC7h"); q.get().then(querySnapshot => { if (querySnapshot.size > 0) { resolve(querySnapshot.docs[0].data()); } else { resolve("No such document!"); } })
补充:直查单文档的方式比where条件查询少了全集合扫描的步骤,查询延迟更低,消耗的读配额也完全一致,是按ID取数的最优方案。
内容的提问来源于stack exchange,提问作者Juliette
相关产品推荐
相关产品推荐

