我正在使用 hyperledger (v0.6) 表并具有如下结构;
var columnDefsTableOne []*shim.ColumnDefinition
columnOneTableOneDef := shim.ColumnDefinition{Name: "RefNum",
Type: shim.ColumnDefinition_STRING, Key: true}
columnTwoTableOneDef := shim.ColumnDefinition{Name: "Amount",
Type: shim.ColumnDefinition_STRING, Key: false}
columnThreeTableOneDef := shim.ColumnDefinition{Name: "Status",
Type: shim.ColumnDefinition_STRING, Key: true}
columnDefsTableOne = append(columnDefsTableOne, &columnOneTableOneDef)
columnDefsTableOne = append(columnDefsTableOne, &columnTwoTableOneDef)
columnDefsTableOne = append(columnDefsTableOne, &columnThreeTableOneDef)
return stub.CreateTable("Recon", columnDefsTableOne)
当我仅使用 RefNum 或同时使用 RefNum 和 Status 查询表时,将返回该行。但是,如果我尝试仅根据 Status 进行查询,则不会返回任何内容。有什么办法可以实现吗?
下面是查询代码
if len(args) < 1 {
return nil, errors.New("Function failed. Must include at least key values")
}
var columns []shim.Column
col1Val := args[0]
col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}}
columns = append(columns, col1)
if len(args) > 1 {
col2Val := args[1]
col2 := shim.Column{Value: &shim.Column_String_{String_: col2Val}}
columns = append(columns, col2)
}
rowChannel, err := stub.GetRows("Recon", columns)
if err != nil {
return nil, fmt.Errorf("Operation failed. %s", err)
}
var rows []shim.Row
for {
select {
case row, ok := <-rowChannel:
if !ok {
rowChannel = nil
} else {
rows = append(rows, row)
}
}
if rowChannel == nil {
break
}
}
jsonRows, err := json.Marshal(rows)
if err != nil {
return nil, fmt.Errorf("Operation failed. Error marshaling JSON: %s", err)
}
return jsonRows, nil
最佳答案
行键不是关系数据库意义上的真正键。在内部,范围查询用于针对串联的键集。因此,查询中的键必须按照与建模时相同的顺序提供。
链代码 API 已在 Fabric v1.0 中更新,使行为更加直观。在 v1.0 中,您可以为复合键建模,然后查询键的子集(同样,按照它们被建模的顺序)。
要查询不同的键组合,您必须为要查询的每个唯一组合建模。将这些视为简单的索引。
在 v1.0 中,您还可以将数据建模为 JSON,并使用 CouchDB 作为状态数据库。在这种情况下,您可以直接查询 JSON 的任何字段。
此处的 marbles02 链代码中有两个数据模式的示例:
https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go.
关于go - 如何查询具有部分键值的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689667/