Hyperledger Fabric Java链码getQueryResult如何筛选指定类型资产
Hyperledger Fabric 按资产类型过滤查询方案
要实现仅查询指定类别的资产,最标准的实现方式如下:
方案1:最佳实践(新增资产类型字段)
Fabric 链码使用CouchDB作为状态数据库时,通用最佳实践是为所有资产新增固定的类型标识字段,通常命名为docType,写入不同类别的资产时给该字段赋值对应的类型值即可,后续查询直接过滤该字段就能实现类型隔离。
步骤1:写入资产时补充类型字段
存入car类资产时,资产JSON结构固定携带docType字段,示例:
{ "docType": "car", "id": "car001", "name": "凯美瑞", "model": "2024款 2.5S 锋尚版", "brand": "丰田", "hash": "xxx" }
truck、aeroplane类资产的docType分别赋值为truck、aeroplane即可。
步骤2:构造带类型过滤的查询语句
如果要查询品牌为指定值的所有car类资产,调用getQueryResult的代码如下:
String targetBrand = "丰田"; // 替换为你要查询的目标品牌 // 构造查询条件:同时匹配docType为car、brand为目标值 String queryJson = String.format("{\"selector\":{\"docType\":\"car\",\"brand\":\"%s\"}}", targetBrand); QueryResultsIterator<KeyValue> results = stub.getQueryResult(queryJson);
方案2:兼容存量资产(无需修改历史数据)
如果你的资产已经存入账本、不方便补加docType字段,可以利用三类资产的专属属性做存在性判断过滤,比如只有car类资产有model属性,可以用$exists运算符判断属性是否存在:
String targetBrand = "丰田"; String queryJson = String.format("{\"selector\":{\"model\":{\"$exists\":true},\"brand\":\"%s\"}}", targetBrand); QueryResultsIterator<KeyValue> results = stub.getQueryResult(queryJson);
注意:该方案可靠性低于方案1,如果后续其他类型资产也新增了
model属性会导致查询结果出错,仅建议临时使用。
内容的提问来源于stack exchange,提问作者famar
相关产品推荐
相关产品推荐

