You need to enable JavaScript to run this app. 为何在Chrome扩展中使用Firestore的where子句无法返回预期对象?
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 09:54:01