在从 Hyperledger Composer v0.18.0 到 v0.19.0 的查询中使用 ORDER BY 的 CouchDB 索引错误
CouchDB Index Error using ORDER BY in queries from Hyperledger Composer v0.18.0 to v0.19.0
从 Hyperledger Composer v0.18.0 迁移到 v0.19.0 时,我在使用 ORDER BY 语句的查询中遇到 CouchDB 索引问题。
Context:
名为事件的简单资产:
asset Event identified by id {
o String id
o String name
o EventType eventType
o DateTime scheduledTime
o EventStatus status
}
带有 ORDER BY 语句的查询:
query getScheduledEvents {
description: "Select all the SCHEDULED Events"
statement:
SELECT event.network.assets.Event
WHERE (status == 'SCHEDULED')
ORDER BY [scheduledTime ASC]
}
HL Composer v0.18.0
使用 Composer v0.18.0 一切正常。我可以从 REST API 中查询事件,只需在 CouchDB 上创建此索引即可:
{
"type": "json",
"def": {
"fields": [
{
"scheduledTime": "asc"
}
],
"partial_filter_selector": {}
}
}
HL Composer v0.19.0
从 Composer v0.19.0(和 Fabric 1.1.0)开始,索引将在部署时自动生成,新索引如下所示:
{
"type": "json",
"def": {
"fields": [
{
"\$class": "asc"
},
{
"\$registryType": "asc"
},
{
"\$registryId": "asc"
},
{
"status": "asc"
},
{
"scheduledTime": "asc"
}
],
"partial_filter_selector": {}
}
}
现在,使用 Composer v0.19.0,查询相同的端点时出现以下错误:
{
"error": {
"statusCode": 500,
"name": "Error",
"message": "2 UNKNOWN: error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.",
"code": 2,
"metadata": {
"_internal_repr": {}
},
"details": "error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.",
"stack": "Error: 2 UNKNOWN: error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.\n at new createStatusError (/home/user/.nvm/versions/node/v8.11.1/lib/node_modules/composer-rest-server/node_modules/grpc/src/client.js:64:15)\n at /home/user/.nvm/versions/node/v8.11.1/lib/node_modules/composer-rest-server/node_modules/grpc/src/client.js:583:15"
}
}
删除生成的索引并创建旧索引无法解决问题,因为我仍然收到相同的错误。
有什么想法吗?
谢谢!
我能够用类似的查询重新创建它,并发现我可以通过重新排列索引文档中的字段来让它工作。在您的情况下,它将安排如下:
{
"type": "json",
"def": {
"fields": [
{
"\$class": "asc"
},
{
"\$registryType": "asc"
},
{
"\$registryId": "asc"
},
{
"scheduledTime": "asc"
},
{
"status": "asc"
}
],
"partial_filter_selector": {}
}
}
我认为这与
的第3条中的解释有关
从 Hyperledger Composer v0.18.0 迁移到 v0.19.0 时,我在使用 ORDER BY 语句的查询中遇到 CouchDB 索引问题。
Context:
名为事件的简单资产:
asset Event identified by id {
o String id
o String name
o EventType eventType
o DateTime scheduledTime
o EventStatus status
}
带有 ORDER BY 语句的查询:
query getScheduledEvents {
description: "Select all the SCHEDULED Events"
statement:
SELECT event.network.assets.Event
WHERE (status == 'SCHEDULED')
ORDER BY [scheduledTime ASC]
}
HL Composer v0.18.0
使用 Composer v0.18.0 一切正常。我可以从 REST API 中查询事件,只需在 CouchDB 上创建此索引即可:
{
"type": "json",
"def": {
"fields": [
{
"scheduledTime": "asc"
}
],
"partial_filter_selector": {}
}
}
HL Composer v0.19.0
从 Composer v0.19.0(和 Fabric 1.1.0)开始,索引将在部署时自动生成,新索引如下所示:
{
"type": "json",
"def": {
"fields": [
{
"\$class": "asc"
},
{
"\$registryType": "asc"
},
{
"\$registryId": "asc"
},
{
"status": "asc"
},
{
"scheduledTime": "asc"
}
],
"partial_filter_selector": {}
}
}
现在,使用 Composer v0.19.0,查询相同的端点时出现以下错误:
{
"error": {
"statusCode": 500,
"name": "Error",
"message": "2 UNKNOWN: error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.",
"code": 2,
"metadata": {
"_internal_repr": {}
},
"details": "error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.",
"stack": "Error: 2 UNKNOWN: error executing chaincode: transaction returned with failure: Error: Couch DB Error:no_usable_index, Status Code:400, Reason:No index exists for this sort, try indexing by the sort fields.\n at new createStatusError (/home/user/.nvm/versions/node/v8.11.1/lib/node_modules/composer-rest-server/node_modules/grpc/src/client.js:64:15)\n at /home/user/.nvm/versions/node/v8.11.1/lib/node_modules/composer-rest-server/node_modules/grpc/src/client.js:583:15"
}
}
删除生成的索引并创建旧索引无法解决问题,因为我仍然收到相同的错误。
有什么想法吗? 谢谢!
我能够用类似的查询重新创建它,并发现我可以通过重新排列索引文档中的字段来让它工作。在您的情况下,它将安排如下:
{
"type": "json",
"def": {
"fields": [
{
"\$class": "asc"
},
{
"\$registryType": "asc"
},
{
"\$registryId": "asc"
},
{
"scheduledTime": "asc"
},
{
"status": "asc"
}
],
"partial_filter_selector": {}
}
}
我认为这与