如何使用部分键值查询表

时间:2017-03-09 07:54:45

标签: go blockchain hyperledger hyperledger-fabric

我正在使用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

1 个答案:

答案 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.