从Hyperledger Composer v0.18.0升级到v0.19.0时CouchDB ORDER BY查询索引报错
解决Hyperledger Composer v0.18升级到v0.19时CouchDB索引的ORDER BY查询问题
我之前升级Hyperledger Composer从v0.18.0到v0.19.0的时候,也碰到过和你一模一样的CouchDB索引问题——带ORDER BY的查询突然跑不动或者报错了。结合你给出的Event资产定义和getScheduledEvents查询场景,给你梳理下具体的解决思路和步骤:
问题根源
Hyperledger Composer v0.19.0对CouchDB的索引生成逻辑做了调整:v0.18.0会自动为包含过滤+排序的查询创建复合索引,但v0.19.0不再自动生成这类索引,需要我们手动创建匹配查询条件的复合索引,否则CouchDB会执行全表扫描,不仅性能差,还可能直接报错。
你的查询是同时过滤status == 'SCHEDULED'并按scheduledTime排序,这就需要一个包含status和scheduledTime的复合索引。
具体解决步骤
1. 确认完整的查询语句
首先确保你的getScheduledEvents查询是完整的,比如:
query getScheduledEvents { description: "Select all the SCHEDULED Events" statement: SELECT event.network.assets.Event WHERE (status == 'SCHEDULED') ORDER BY scheduledTime ASC }
(如果是降序排序就把ASC换成DESC,不影响索引创建逻辑)
2. 创建CouchDB复合索引
你需要在对应的业务网络数据库中创建复合索引,这里提供两种方式:
方式一:通过CouchDB Fauxton界面创建
- 打开CouchDB的Fauxton管理界面(默认地址是
http://<couchdb-host>:5984/_utils) - 找到业务网络对应的数据库(命名格式一般是
composer-<your-business-network-name>) - 进入
Indexes页面,点击New Index - 选择
JSON Index,填入以下索引定义:
{ "index": { "fields": ["status", "scheduledTime"] }, "ddoc": "event-status-scheduled-index", "name": "event-status-scheduled-index", "type": "json" }
- 点击
Create Index完成创建
方式二:通过curl命令创建
执行以下命令替换对应的参数:
curl -X PUT http://<couchdb-user>:<couchdb-password>@<couchdb-host>:5984/composer-<your-business-network-name>/_design/event-status-scheduled-index \ -d '{ "index": { "fields": ["status", "scheduledTime"] }, "type": "json" }'
3. 验证查询有效性
索引创建完成后,重新部署你的业务网络(确保资产数据的存储结构和索引匹配),然后测试getScheduledEvents查询,应该就能正常返回排序后的结果了。
额外注意事项
- 复合索引的字段顺序很重要:一定要把
WHERE子句中的过滤字段(这里是status)放在前面,排序字段(scheduledTime)放在后面,这样CouchDB才能先过滤再高效排序。 - 如果你的查询需要支持降序排序,不需要单独创建反向索引,CouchDB可以反向遍历已有的升序索引,性能几乎没有差异。
- 升级后如果有其他带
WHERE+ORDER BY的查询,都需要按照这个逻辑手动创建对应的复合索引。
内容的提问来源于stack exchange,提问作者nicolapaoli
相关产品推荐
相关产品推荐

