2017-03-09 4 views
1

Ich arbeite mit Hyperledger (v0.6) Tabellen und haben eine Struktur wie folgt;Wie Abfrage Tabelle mit partiellen Schlüsselwerten

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) 

Wenn ich die Tabelle mit RefNum Abfrage nur oder beide RefNum & Der Status, wird die Zeile zurückgegeben. Aber wenn ich versuche, nur auf der Grundlage von Status abzufragen, wird nichts zurückgegeben. Gibt es einen Weg, dies zu erreichen?

unten ist der Abfrage-Code

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 

Antwort

1

Die Reihe Tasten sind nicht wahr Schlüssel im Sinne einer relationalen Datenbank. Intern werden Bereichsabfragen für die verketteten Schlüssel verwendet. Daher müssen die Schlüssel in der Abfrage in derselben Reihenfolge bereitgestellt werden, in der sie modelliert wurden.

Die Chaincode-APIs wurden in Fabric v1.0 aktualisiert, um das Verhalten intuitiver zu gestalten. In Version 1.0 können Sie einen zusammengesetzten Schlüssel modellieren und dann eine Teilmenge der Schlüssel abfragen (wiederum in der Reihenfolge, in der sie modelliert wurden).

Um verschiedene Kombinationen von Schlüsseln abzufragen, müssten Sie jede eindeutige Kombination modellieren, die Sie abfragen möchten. Stellen Sie sich diese als einfache Indizes vor.

In v1.0 können Sie Ihre Daten auch als JSON modellieren und CouchDB als Zustandsdatenbank verwenden. In diesem Fall können Sie direkt ein beliebiges Feld des JSON abfragen.

Es ist ein Beispiel für beiden Datenmuster in dem marbles02 chaincode hier:

https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go. 
Verwandte Themen