go - shim.GetStateByPartialCompositeKey迭代器在此代码中如何工作?

标签 go hyperledger-fabric shim hyperledger-chaincode

我正在编写将一些数据放入分类帐的链码,然后尝试使用shim.GetStateByPartialCompositeKey()将其列出,并从迭代器中获取数据列表。现在,我想根据时间戳对数据进行排序(仅按日期进行格式化,而无需花费小时,分钟或秒)。因此,我想知道从迭代器列出的数据是否按照时间戳的顺序进行排序,这些时间戳存储在分类帐中,还是我需要对它们进行排序?

var AvalList = make([]A, 0)
iterator, err := stub.GetStateByPartialCompositeKey("AId~BId", []string{AId})
    if err != nil {
        fmt.Println("error is ", err)
        return shim.Error(err.Error())
    }
    fmt.Println("Iterator is ", iterator)
    if !iterator.HasNext() {
        fmt.Println("---------------------  Iterator not found!!!  --------------------")
        return shim.Error(err.Error())
    }
    defer iterator.Close()

    for i := 0; iterator.HasNext(); i++ {
        ARange, err := iterator.Next()
        if err != nil {
            return shim.Error(err.Error())
        }

        objectType, compositeKeyParts, err := stub.SplitCompositeKey(ARange.Key)
        if err != nil {
            return shim.Error(err.Error())
        }

        returnedA := compositeKeyParts[1]
        fmt.Printf("Found a A of index %s and id %s ", objectType, returnedA)

        ABytes, err := stub.GetState(returnedA)
        if err != nil {
            return shim.Error(err.Error())
        }
        if ABytes == nil {
            fmt.Println("A not found")
            return shim.Error("Entity not found")
        }


        a := A{}
        err = json.Unmarshal(ABytes, &a)
        if err != nil {
            return shim.Error("Failed to unmarshal")
        }

            AvalList = append(AvalList, a)
    }

最佳答案

GetStateByPartialCompositeKey基于给定的部分组合键查询分类帐中的状态。此函数返回一个迭代器,该迭代器可用于迭代其前缀与给定的部分组合键匹配的组合键。

阅读https://github.com/hyperledger/fabric-chaincode-go/blob/master/shim/interfaces.go

现在,根据问题,

我从迭代器中列出的数据按时间戳排序

不会。它不会按排序顺序。例如,如果您要查询的是批量数据
那么迭代器将获得所有不一定按排序顺序的组合键。因此,您必须对它们进行排序。

一种方法是使用sort.Sort()函数。
在这里要求类似的方法How to sort by time.Time

关于go - shim.GetStateByPartialCompositeKey迭代器在此代码中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57794066/

相关文章:

hyperledger-fabric - Hyperledger Fabric Composer

docker - Docker设置-在本地运行Chaincode时遇到问题

c# - 清洁解决方案不清洁 FakesAssemblies?

terminology - 垫片和填充 Material 有什么区别?

go - 有没有支持交易的 Kafka Go 客户端?

linq - Go 泛型是否允许 LINQ to Objects 等效?

postgresql - GORM 不会创建 Many2many 关联

docker - 在 helm 安装之前将 go 二进制文件移动到 pod 中的惯用方法是什么?

hyperledger-fabric - AWS CloudFormation 启动 Hyperledger Fabric 失败,错误为 : failed to create: [EC2InstanceForDev]

c# - 伪造方法导致 "incompatible method and shim"异常