2017-03-09 5 views
1

나는 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) 

은 행이 반환됩니다. 그러나 상태 인에 대해서만 쿼리를 시도하면 아무 것도 반환되지 않습니다. 이것을 달성 할 수있는 방법이 있습니까?

다음은 쿼리 코드

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

행 키는 관계형 데이터베이스의 의미에서 진정한 키 없습니다에게 있습니다. 내부적으로 범위 쿼리는 연결된 키 집합에 대해 사용됩니다. 따라서 쿼리의 키는 모델링 된 순서와 동일한 순서로 제공되어야합니다.

더 직관적으로 동작시키기 위해 fabriccode v1.0에서 chaincode API가 업데이트되었습니다. v1.0에서는 복합 키를 모델링 한 다음 키 하위 집합에 대해 쿼리 할 수 ​​있습니다 (다시 모델링 된 순서대로).

다른 키 조합을 쿼리하려면 쿼리 할 각 고유 한 조합을 모델링해야합니다. 이것들을 단순한 인덱스라고 생각하십시오.

v1.0에서는 데이터를 JSON으로 모델링하고 CouchDB를 상태 데이터베이스로 활용할 수도 있습니다. 이 경우 JSON의 모든 필드를 직접 쿼리 할 수 ​​있습니다.

https://github.com/hyperledger/fabric/blob/release/examples/chaincode/go/marbles02/marbles_chaincode.go. 
: 여기 marbles02의 chaincode 모두 데이터 패턴의 예입니다