为何在Chrome扩展中使用Firestore的where子句无法返回预期对象?
第二段代码的问题定位
核心逻辑错误:混淆了两类查询的返回对象类型
你之前用doc("指定文档ID")的直查方式,和用where()的条件集合查询,两个场景下.get()返回的回调对象结构完全不同,不能直接套用单文档的判断代码:
- 直查单文档时,
.get()返回单个文档快照(DocumentSnapshot),才会带exists(判断文档是否存在)、data()(读取文档字段)这两个属性 - 带
where()的集合条件查询,.get()返回的是整个查询结果集的快照(QuerySnapshot),这个对象本身根本没有exists、data()属性。你现在代码里写的if (doc.exists)读出来的值永远是undefined,会直接走else分支弹出"no doc found",和数据库里有没有匹配数据完全无关。
修正后的代码逻辑
按照集合查询的返回规则调整判断和取值方式即可:
try{ db .collection("channel") .where("ch_id",'==', ch_id) .get() .then(function(querySnapshot) { // 先判断查询结果集是否为空 if (querySnapshot.empty) { alert('no doc found'); return; } // 遍历所有匹配的文档,逐个读取字段 querySnapshot.forEach(function(doc) { alert('匹配到的ch_id值:' + doc.data().ch_id); }) }).catch(function(error) { alert('e1'+error.message); }); }catch(error) { alert('e2'+error.message); }
补充提示
如果改完逻辑后运行时抛出需要创建索引的报错,按照Firestore控制台的提示创建对应复合索引即可,这是数据库的查询规则要求,不属于代码逻辑错误。
内容的提问来源于stack exchange,提问作者Ruwan Kumara Liyanage
相关产品推荐
相关产品推荐

