shim.GetStateByPartialCompositeKey 迭代器在此代码中如何工作?
How does shim.GetStateByPartialCompositeKey iterator works in this code?
我正在编写链代码,其中我将一些数据放入分类帐中,然后尝试使用 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 根据给定的部分复合键查询分类帐中的状态。此函数 returns 一个迭代器,可用于迭代其前缀与给定的部分复合键匹配的复合键。
阅读https://github.com/hyperledger/fabric-chaincode-go/blob/master/shim/interfaces.go
现在,根据问题,
data I listed from the iterator comes in sorted order in terms of timestamp
没有。它不会按排序顺序排列。例如,如果您有要查询的批量数据
然后迭代器将获得所有复合键,这些键不一定按排序顺序排列。因此你必须对它们进行排序。
其中一种方法是使用 sort.Sort() 函数。
此处询问类似的方法 How to sort by time.Time
我正在编写链代码,其中我将一些数据放入分类帐中,然后尝试使用 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 根据给定的部分复合键查询分类帐中的状态。此函数 returns 一个迭代器,可用于迭代其前缀与给定的部分复合键匹配的复合键。
阅读https://github.com/hyperledger/fabric-chaincode-go/blob/master/shim/interfaces.go
现在,根据问题,
data I listed from the iterator comes in sorted order in terms of timestamp
没有。它不会按排序顺序排列。例如,如果您有要查询的批量数据 然后迭代器将获得所有复合键,这些键不一定按排序顺序排列。因此你必须对它们进行排序。
其中一种方法是使用 sort.Sort() 函数。 此处询问类似的方法 How to sort by time.Time