我正在使用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 和& 状态,返回行。但是,如果我尝试仅基于状态进行查询,则不会返回任何内容。有没有办法实现这个目标?
以下是查询代码
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
答案 0 :(得分:1)
在关系数据库意义上,行键不是真正的键。在内部,范围查询用于连接的密钥集。因此,查询中的键必须按照建模时的顺序提供。
在Fabric v1.0中更新了链代码API,使行为更加直观。在v1.0中,您可以对复合键进行建模,然后查询键的子集(同样,按照它们的建模顺序)。
要查询不同的键组合,您必须为要查询的每个唯一组合建模。将这些视为简单的索引。
在v1.0中,您还可以将数据建模为JSON,并将CouchDB用作状态数据库。在这种情况下,您可以直接查询JSON的任何字段。
这里有marbles02链代码中的两种数据模式的例子:
https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go.