小編給大家分享一下Hyperledger Fabric中couchdb豐富查詢(xún)selector語(yǔ)法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
向陽(yáng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!
組合字符列表:
"$and" - 數(shù)組參數(shù)
"$or" - 數(shù)組參數(shù)
"$not" - 單一參數(shù)
"$nor" - 數(shù)組參數(shù)
"$all" - 數(shù)組參數(shù)(數(shù)組值的特殊運(yùn)算符)
"$elemMatch" - 單一參數(shù)(數(shù)組值的特殊運(yùn)算符)
條件參數(shù)列表:
平等運(yùn)算符
"$lt" - 任意 JSON
"$lte" - 任意 JSON
"$eq" - 任意 JSON
"$ne" - 任意 JSON
"$gte" - 任意 JSON
"$gt" - 任意 JSON
對(duì)象相關(guān)運(yùn)算符
"$exists" - 布爾值,檢查字段是否存在,無(wú)論其值如何
"$type" - 字符串,檢查文檔字段的類(lèi)型
數(shù)組相關(guān)運(yùn)算符
"$in" - JSON值數(shù)組,文檔字段必須存在于提供的列表中
"$nin" - JSON值數(shù)組,文檔字段不得存在于提供的列表中
"$size" - 整數(shù),特殊條件,用于匹配文檔中數(shù)組字段的長(zhǎng)度。非數(shù)組字段無(wú)法匹配此條件。
其他相關(guān)運(yùn)營(yíng)商
"$mod" - [Divisor,Remainder],其中Divisor和Remainder都是正整數(shù)(即大于0)。匹配文檔where(field%Divisor == Remainder)為true。對(duì)于任何非整數(shù)字段,這都是錯(cuò)誤的
"$regex" - 字符串,與文檔字段匹配的正則表達(dá)式模式。僅當(dāng)字段為字符串值并與提供的匹配項(xiàng)匹配時(shí)才匹配
{"selector":{"name":"tom"}}
其中
{"name":"tom"}
匹配 name 為 tom 的文檔(如果存在)。使用其他字段擴(kuò)展此示例可能如下所示:
{"name": "tom", "location": "Boston"}
這將匹配一個(gè) name 叫 tom 的文件和擁有 Boston 的 location 值。
如果選擇器中的對(duì)象鍵有兩個(gè)特殊的語(yǔ)法元素(句號(hào)或簡(jiǎn)稱(chēng))字符表示文檔中的子字段。例如,這是兩個(gè)相同的例子:
{"location": {"city": "Omaha"}} {"location.city": "Omaha"}
如果對(duì)象的鍵包含句號(hào),則可以使用反斜杠進(jìn)行轉(zhuǎn)義,即
{"location\\.city": "Omaha"}
請(qǐng)注意,這里需要雙反斜杠來(lái)編碼實(shí)際的單反斜杠。
第二個(gè)重要的語(yǔ)法元素是使用美元符號(hào)($)前綴來(lái)表示運(yùn)算符。例如:
{"age": {"$gt": 21}}
在這個(gè)例子中創(chuàng)建了布爾表達(dá)式 age > 21 。
在大多數(shù)情況下,每個(gè)操作員必須具有該形式{"$operator": argument}。雖然選擇器有兩個(gè)隱式運(yùn)算符。
首先,任何不是條件運(yùn)算符參數(shù)的JSON對(duì)象都是 $and 每個(gè)字段的隱式運(yùn)算符。例如,這兩個(gè)例子是相同的:
{"foo": "bar", "baz": true} {"$and": [{"foo": {"$eq": "bar"}}, {"baz": {"$eq": true}}]}
所以任何包含沒(méi)有運(yùn)算符的JSON值的字段都是相等的條件。例如,這些是等價(jià)的:
{"foo": "bar"} {"foo": {"$eq": "bar"}}
需要明確的是,這些也是等效的:
{"foo": {"bar": "baz"}} {"foo": {"$eq": {"bar": "baz"}}}
雖然,前面的例子實(shí)際上會(huì)在內(nèi)部標(biāo)準(zhǔn)化為:
{"foo.bar": {"$eq": "baz"}}
CouchDB 使用了MongoDB 的查詢(xún)語(yǔ)言 Mango ,具體可以查看https://github.com/cloudant/mango
一個(gè)Couchdb豐富查詢(xún)實(shí)戰(zhàn)的chaincode
package main import ( "fmt" /*導(dǎo)入 chaincode shim 包和 peer protobuf 包*/ "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" "encoding/json" "time" "strconv" "bytes" "strings" ) //參考: https://github.com/cloudant/mango const prefix = "jonluo" type CloudCertificateChaincode struct { } // 云證 type CloudCertificate struct { CloudCardNumber string `json:"cloudCardNumber"` //云證編號(hào) CloudCardPerson string `json:"cloudCardPerson"` //存證方 CloudCardPlatform string `json:"cloudCardPlatform"` //傳證平臺(tái) Time int64 `json:"time"` //存證時(shí)間 BlockNumber string `json:"blockNumber"` //存證區(qū)塊號(hào) CloudCardHash string `json:"cloudCardHash"` //存證hash FileType string `json:"fileType"` //文件類(lèi)型 FileLabel string `json:"fileLabel"` //文件標(biāo)簽 FileName string `json:"fileName"` //文件名 FileAddress string `json:"fileAddress"` //下載地址 } //初始化方法 func (s *CloudCertificateChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response { return shim.Success(nil) } //調(diào)用Chaincode func (s *CloudCertificateChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response { //獲取要調(diào)用的方法名和方法參數(shù) fn, args := stub.GetFunctionAndParameters() fmt.Printf("方法: %s 參數(shù) : %s \n", fn, args) if fn == "addCard" { return s.addCard(stub, args) } else if fn == "getList" { return s.getList(stub, args) } else if fn == "get" { return s.get(stub, args) } return shim.Error("方法不存在") } func (s *CloudCertificateChaincode) addCard(stub shim.ChaincodeStubInterface, args []string) peer.Response { if len(args) != 1 { return shim.Error("參數(shù)出錯(cuò)") } cardStr := args[0] var card CloudCertificate //這里就是實(shí)際的解碼和相關(guān)的錯(cuò)誤檢查 if err := json.Unmarshal([]byte(cardStr), &card); err != nil { return shim.Error("json反序列化失敗") } t := time.Now() id := prefix + strconv.FormatInt(t.UnixNano(), 10) card.CloudCardNumber = id card.Time = t.Unix() bys, err := json.Marshal(card) fmt.Println("json:" + string(bys)) if err != nil { return shim.Error("json序列化失敗") } err = stub.PutState(id, bys) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } func (s *CloudCertificateChaincode) getList(stub shim.ChaincodeStubInterface, args []string) peer.Response { if len(args) != 3 { return shim.Error("要輸入一個(gè)鍵") } page, err := strconv.Atoi(args[0]) if err != nil { return shim.Error("page 出錯(cuò)") } size, err := strconv.Atoi(args[1]) if err != nil { return shim.Error("size 出錯(cuò)") } index := (page - 1) * size pmap := map[string]string{} if err := json.Unmarshal([]byte(args[2]), &pmap); err != nil { return shim.Error("json反序列化失敗") } //封裝條件 selector := selectionCriteria(pmap) fmt.Println(selector) queryIterator, err := stub.GetQueryResult(selector) defer queryIterator.Close() var list = make([]CloudCertificate, 0) if err != nil { return shim.Error("GetQueryResult 出錯(cuò)") } else { var next = 0 for queryIterator.HasNext() { if next == page*size { break } if next >= index { item, err := queryIterator.Next() if err != nil { return shim.Error("queryIterator.Next 出錯(cuò)") } var c CloudCertificate err = json.Unmarshal(item.Value, &c) if err != nil { return shim.Error("json反序列化失敗") } list = append(list, c) } next++ } } msg, err := json.Marshal(list) fmt.Println("json:" + string(msg)) if err != nil { return shim.Error("json序列化失敗") } return shim.Success(msg) } func (s *CloudCertificateChaincode) get(stub shim.ChaincodeStubInterface, args []string) peer.Response { if len(args) != 1 { return shim.Error("要輸入一個(gè)鍵") } //讀出 value, err := stub.GetState(args[0]) if err != nil { return shim.Error(err.Error()) } return shim.Success(value) } func selectionCriteria(pmap map[string]string) string { var buffer bytes.Buffer buffer.WriteString(`{"selector":{`) buffer.WriteString(`"cloudCardNumber":{"$regex": "^` + prefix + `.*"},`) for k, v := range pmap { switch k { case "startTime": if v != "" { buffer.WriteString(`"time":{"$gte": ` + v + `},`) } case "endTime": if v != "" { buffer.WriteString(`"time":{"$lte": ` + v + `},`) } case "startTime-endTime": if v != "" { args := strings.Split(v,"-") buffer.WriteString(`"time":{"$gte": ` + args[0] + `,"$lte": ` + args[1] + `},`) } case "fileType": if v != "" && v != "," { types := `"fileType":{"$or":[` args := strings.Split(v,",") for i,tyv := range args { if i != 0 { types += `,` } types +=`{"$eq":"`+tyv+`"}` } types += `]},` buffer.WriteString(types) } default: if k != "" && v != "" { buffer.WriteString(`"` + k + `":{"$eq": "` + v + `"},`) } } } buffer.Truncate(buffer.Len()-1) buffer.WriteString("}}") return buffer.String() } func main() { if err := shim.Start(new(CloudCertificateChaincode)); err != nil { fmt.Println("CloudCertificateChaincode start error") } }
以上是“Hyperledger Fabric中couchdb豐富查詢(xún)selector語(yǔ)法有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前題目:HyperledgerFabric中couchdb豐富查詢(xún)selector語(yǔ)法有哪些
當(dāng)前鏈接:http://jinyejixie.com/article28/jpdcjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、虛擬主機(jī)、小程序開(kāi)發(fā)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)