2017-08-21 47 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