CouchDB调用sort方法查询报错No index exists for this sort怎么解决?
报错原因
CouchDB的Mango查询遵循复合索引最左前缀匹配原则,你创建的是["timestamp", "upVote"]的复合索引,只有查询筛选条件包含索引的第一个字段timestamp时,后续的索引字段才会生效。
你当前的查询仅对upVote做筛选、排序,没有用到timestamp字段,该复合索引无法被命中,因此系统找不到支持upVote排序的可用索引,触发报错。
修复方案
根据你的业务需求选择以下任意一种方案即可:
- 方案一:单独创建
upVote单字段索引(适合不需要用timestamp做筛选/排序的场景)
db.createIndex({ index: { fields: ["upVote"] }, }).then(() => { this.intitialDatafromDB(db); });
- 方案二:调整复合索引的字段顺序,把需要筛选、排序的
upVote放在索引首位(适合后续还需要结合timestamp做查询的场景)
db.createIndex({ index: { fields: ["upVote", "timestamp"] }, }).then(() => { this.intitialDatafromDB(db); });
额外注意
如果要保留原来的["timestamp", "upVote"]索引,必须在查询的selector中增加timestamp的筛选条件,且排序规则要先按timestamp排序再按upVote排序才能命中索引,该方案不符合你当前的查询逻辑,不推荐使用。
索引创建是异步操作,建完索引后建议先调用db.getIndexes()确认索引创建完成,再执行查询逻辑,避免时序问题导致的偶发报错。
内容的提问来源于stack exchange,提问作者Andrews Gilbert
相关产品推荐
相关产品推荐

