2017-08-21 46 views
0

關於this的問題,我也有疑問。
假設我的複合密鑰與字段Owner_id~dateOfcreation 形成和我的鍵是這樣的:Hyperledger織物中日期範圍的複合鍵形成V1.0

  • Owner1〜2017年11月5日
  • Owner1〜2017年12月5日
  • Owner1〜13 -05-2017
  • ...
  • ...
  • Owner1〜30-05-2017

,纔有可能對我來說,得到會員國爲date range例如Owner1~12-05-2017 to Owner~27-05-2017

根據我的理解,stub.GetStateByRange(startKey,endKey)將返回詞法順序的鍵,所以它不會返回預期的範圍。 糾正我,如果我錯了。

我試圖重新安排,如鍵:

  • Owner1〜2017_05_11
  • Owner1〜2017_05_12
  • Owner1〜2017_05_13
  • ...
  • ...
  • Owner1〜2017_05_30

在這種情況下,如果我使用
stub.GetStateByPartialCompositeKey('owner~year~month~day',[]string{"owner1","2017","05"})它將返回從這些範圍開始的所有鍵。這是對的嗎?

但是這裏我也沒有得到我的確切輸出爲date range

任何人都可以建議我正確的方式來實現這一點。我認爲這是資產共享背景下的常見業務情景,請大家幫忙。

感謝提前:)

+0

我不知道它是如何工作的,但我沒有使用數字來實現它。另外,您是否可以嘗試將「所有者1」替換爲「所有者1」,即O以大寫字母 – Urko

+0

對不起,我沒有得到您。你沒有數字取得了什麼?任何爲什麼要創造'O'資本? – Girish007

+0

嗨! stub.GetStateByRange(startKey,endKey)方法對我很好。對於我來說鍵是數字與字母組合,如c999,o111。另一方面,我問你是否可以用大寫字母把O的所有者的價值傳遞給O.在你給出的例子中,你通過的所有者是小寫。此外,你可以嘗試,如果它傳遞兩個文字(例如:stub.GetStateByPartialCompositeKey('Owner1〜2017_05_11','Owner1〜2017_05_30'))?你如何迴應? – Urko

回答

0

與現有意見,採用的解決方案和API規範一樣,得出的結論是stub.GetStateByPartialCompositeKey是最適合此要求的API。
,如果它是使用CouchDB的作爲其狀態DB只有一天獲取數據,它可以使用豐富的查詢使用JSON date_field:value也。由於它不是承諾transcation沒有問題在這裏使用豐富查詢

1

重讀你的問題和意見後,我認爲你有你自己的解決方案。那麼使用函數GetStateByRange怎麼樣?這個函數不返回鍵,它返回一個帶有值的迭代器。

正如您在上次評論中所說的,我想列出在日期範圍內創建的所有資產,我將如何從分類帳中查詢它。所以,如果我是你,我會使用GetStateByRange函數,並將日期範圍傳遞給它。

在這裏我粘貼你一個我使用的函數的例子。

func get_all_components(stub shim.ChaincodeStubInterface, args []string) pb.Response { 
    var err error 
    fmt.Println("starting get_all_components") 

    // input sanitation 
    err = sanitize_arguments_len(args, 1) 
    if err != nil { 
     return shim.Error(err.Error()) 
    } 

    // ---- Get All Components ---- // 
    resultsIterator, err := stub.GetStateByRange("c0", "c9999999999999999999") 
    if err != nil { 
     return shim.Error(err.Error()) 
    } 
    defer resultsIterator.Close() 

    // buffer is a JSON array containing QueryRecords 
    var buffer bytes.Buffer 
    buffer.WriteString("[") 

    bArrayMemberAlreadyWritten := false 
    for resultsIterator.HasNext() { 
     //queryKeyAsStr, queryValAsBytes, err := resultsIterator.Next() 
     queryResponse, err := resultsIterator.Next() 
     if err != nil { 
      return shim.Error(err.Error()) 
     } 

     // Add a comma before array members, suppress it for the first array member 
     if bArrayMemberAlreadyWritten == true { 
      buffer.WriteString(",") 
     } 
     buffer.WriteString("{\"Key\":") 
     buffer.WriteString("\"") 
     buffer.WriteString(queryResponse.Key) 
     buffer.WriteString("\"") 

     buffer.WriteString(", \"Record\":") 
     // Record is a JSON object, so we write as-is 
     buffer.WriteString(string(queryResponse.Value)) 
     buffer.WriteString("}") 
     bArrayMemberAlreadyWritten = true 
    } 
    buffer.WriteString("]") 

    fmt.Printf("get_all_components:\n%s\n", buffer.String()) 

    return shim.Success(buffer.Bytes()) 
} 

你應該通過你的date range值的函數調用,在ARGS。

+0

是的。這是一個好方法。所以在我的情況下使用stub.GetStateByRange(「c0」,「c9999999999999999999」),我需要創建像Owner1_ 的權利?示例爲11-05-2017 00:00:00提取數據到10-06-2017 23:59:59我需要使用像stub.GetStateByRange(「Owner1_ 」,「Owner1_ < (second_date)>「的長時間戳)。我對嗎? – Girish007

+0

是的。可能它只會通過日期而不是時間,但我不知道。你會嘗試。祝你好運。 – Urko

+0

另一個疑問是stub.GetStateByRange(「c0」,「c9999999999999999999」)它是如何在內部工作的。如果數據的範圍或數量增加,將會有任何性能下降? – Girish007