前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Fabric链码中进行前缀批查询

在Fabric链码中进行前缀批查询

作者头像
深蓝studyzy
发布2022-06-16 16:22:02
5430
发布2022-06-16 16:22:02
举报
文章被收录于专栏:深蓝居

用过Fabric的都知道,在Fabric中的状态数据库提供了Couchdb和Leveldb两种实现,一般我们都会使用Couchdb作为状态数据库的默认实现,主要是因为Couchdb可以进行富查询。但是在某些情况下我们只能采用Leveldb的情况下,我们无法使用富查询,那么怎么办?我们可以利用Leveldb适合前缀查询的特点进行前缀查询,而且由于Leveldb底层结构的特点,进行前缀查询的效率是特别高的。

要进行前缀查询,那么我们在PutState的时候要合理设计前缀值,从而能够利用前缀查询。以一个会议签到存证系统为例,我们在Fabric的链码中设计了两个对象Meeting和CheckinLog。

会议对象Meeting的存证我们设计Key为:“Meeting_”+会议ID,然后PutState将会议的JSON存入Fabric中。

签到记录对象CheckinLog的存证,我们设计Key为:”Checkin_”+会议ID+”_”+用户ID,然后调用PutState将CheckinLog这个对象的Json作为Value存入到Fabric中。

接下来是对某个会议的签到记录的查询了。这么我们知道会议ID的情况下,查询签到记录返回的是一个集合,那么我们可以基于stub.GetStateByRange接口来进行查询,该操作的核心就是要构造其两个参数startKey和endKey。以下是代码实现,主要用到了BytesPrefix函数用于计算endKey,该函数是在github.com/syndtr/goleveldb/leveldb/util有的,我们直接摘抄出来即可。

代码语言:javascript
复制
//根据会议ID,返回本次会议的签到记录列表
func QueryCheckinLogsByMeetingId(stub shim.ChaincodeStubInterface, meetingId int) ([]*CheckinLog, error) {
    startKey:=fmt.Sprintf( "Checkin_%d_",meetingId)
    endKey:=string(BytesPrefix([]byte(startKey)))
    resultsIterator, err:= stub.GetStateByRange(startKey,endKey)
    defer resultsIterator.Close()
    if err != nil {
        return nil, err
    }
    result:=[]*CheckinLog{}
    for resultsIterator.HasNext() {
        queryResponse,err:= resultsIterator.Next()
        if err != nil {
            return nil, err
        }
        row:=&CheckinLog{}
        json.Unmarshal(queryResponse.Value,row)
        result=append(result,row)
    }
    return result, nil
}

//计算GetStateByRange时的endKey,该函数摘自:github.com/syndtr/goleveldb/leveldb/util
func BytesPrefix(prefix []byte) []byte {
    var limit []byte
    for i := len(prefix) - 1; i >= 0; i-- {
        c := prefix[i]
        if c < 0xff {
            limit = make([]byte, i+1)
            copy(limit, prefix)
            limit[i] = c + 1
            break
        }
    }
    return limit
}

就是这样的逻辑,我们就可以在Fabric链码中通过前缀进行批量查询。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档