Firestore多字段查询问题:添加orderBy后无数据返回
问题解决:Firestore查询添加orderBy后无返回数据
问题场景
你有一个notifications集合,文档结构如下:
created_at: 28 January 2023 at 14:41:04 UTC+5 id: "e44a154f-b0cb-4ef6-bc27-af37f178b46c" message: "1 Orders has been uploaded successfully" read: true writer: "16315bd844e95c5926a92bda9"
想要查询writer等于"16315bd844e95c5926a92bda9"的记录,并按created_at降序排序,使用了以下查询代码:
const ref = collection(db, "notifications") query( ref, where("writer", "==", '16315bd844e95c5926a92bda9'), orderBy('created_at', 'desc'), limit(5) )
但添加orderBy后查询无返回数据,移除orderBy则能正常过滤出符合条件的数据。
原因分析
Firestore在同时使用where过滤和orderBy排序时,必须创建复合索引,否则查询会静默失败(返回空结果)。这是因为Firestore需要预构建索引来高效处理这类组合查询。
解决方案
手动创建复合索引
- 登录Firebase控制台,进入你的项目的Firestore数据库页面
- 切换到"索引"标签页,点击"创建索引"
- 在索引配置页面:
- 集合ID选择
notifications - 添加第一个字段:
writer,排序方式选"升序" - 添加第二个字段:
created_at,排序方式选"降序" - 索引名称可自动生成或自定义
- 集合ID选择
- 点击"创建",等待索引构建完成(一般1-5分钟)
- 重新运行查询即可获取结果
快捷创建方式
如果项目在浏览器环境运行,打开浏览器控制台执行查询后,会看到包含直接创建所需索引的错误信息,点击链接可跳转到Firebase控制台的索引创建页面,自动填充好配置,确认创建即可。
内容的提问来源于stack exchange,提问作者Noman M. Khan
相关产品推荐
相关产品推荐

