0

我正在编写将一些数据放入分类帐的链代码,然后尝试使用 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)
    }
4

1 回答 1

0

GetStateByPartialCompositeKey 根据给定的部分复合键查询账本中的状态。此函数返回一个迭代器,可用于迭代其前缀与给定部分复合键匹配的复合键。

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

现在,根据问题,

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

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

其中一种方法是使用 sort.Sort() 函数。类似的方法在这里问如何按时间排序。时间

于 2019-11-19T10:39:55.100 回答