Loopback API调用Cloudant数据库提示no_usable_index错误求助
这个问题我之前碰到过好多次,核心原因就是你的查询里用到了排序逻辑,但CouchDB没有对应的可用索引来支撑这个排序操作。别着急,按下面的步骤一步步来就能搞定:
先明确排序字段:先回到API Explorer,检查你的GET请求里的
filter参数,特别是order部分——比如可能是filter[order]=createdAt DESC或者其他字段。把这个需要排序的字段(或者多个字段组合)记下来,这就是我们要创建索引的目标。在Loopback模型中定义索引:找到对应模型的JSON配置文件(一般在
common/models/[你的模型名].json),添加indexes字段来定义索引。举个例子,如果排序字段是createdAt,可以这么写:
"indexes": { "createdAt_sort_index": { "keys": { "createdAt": "desc" } } }
如果是多字段排序(比如createdAt DESC, name ASC),就把多个字段加进去:
"indexes": { "multi_field_sort_index": { "keys": { "createdAt": "desc", "name": "asc" } } }
重启应用让索引生效:修改完模型配置后,重启你的Loopback服务。如果开启了自动迁移(默认是开启的),Loopback会自动在CouchDB中创建这个索引;如果自动迁移没触发,就需要手动创建索引。
手动创建索引(可选):如果自动创建没生效,直接用CouchDB的API手动创建。比如用curl命令:
curl -X POST http://你的CouchDB地址/你的数据库名/_index \ -H "Content-Type: application/json" \ -d '{ "index": { "fields": [{"createdAt": "desc"}] }, "name": "createdAt_sort_index", "type": "json" }'
这里的fields要和你的排序规则完全对应,多字段的话就依次添加。
验证索引是否存在:创建完成后,访问
http://你的CouchDB地址/你的数据库名/_index,检查刚才创建的索引是否出现在列表里。注意CouchDB的索引是异步构建的,可能需要等个几秒钟再测试。重新测试API:回到Loopback API Explorer,再次点击「Try this」按钮,这次应该就能正常返回数据,不会再出现
no_usable_index错误了。
另外提个优化点:如果你的查询同时包含过滤条件和排序,最好创建复合索引(把过滤字段和排序字段都包含进去),这样能大幅提升查询效率。比如过滤status字段同时按createdAt排序,索引可以这么定义:
"indexes": { "status_createdAt_index": { "keys": { "status": "asc", "createdAt": "desc" } } }
内容的提问来源于stack exchange,提问作者NorthDecoder

