HyperledgerFabric中couchdb豐富查詢selector語法有哪些

小編給大家分享一下Hyperledger Fabric中couchdb豐富查詢selector語法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

向陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

Couchdb 查詢 Selector 選擇器語法

組合字符列表:

  • "$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

對象相關(guān)運(yùn)算符

  • "$exists" - 布爾值,檢查字段是否存在,無論其值如何

  • "$type" - 字符串,檢查文檔字段的類型

數(shù)組相關(guān)運(yùn)算符

  • "$in" - JSON值數(shù)組,文檔字段必須存在于提供的列表中

  • "$nin" - JSON值數(shù)組,文檔字段不得存在于提供的列表中

  • "$size" - 整數(shù),特殊條件,用于匹配文檔中數(shù)組字段的長度。非數(shù)組字段無法匹配此條件。

其他相關(guān)運(yùn)營商

  • "$mod" - [Divisor,Remainder],其中Divisor和Remainder都是正整數(shù)(即大于0)。匹配文檔where(field%Divisor == Remainder)為true。對于任何非整數(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 值。

如果選擇器中的對象鍵有兩個(gè)特殊的語法元素(句號或簡稱)字符表示文檔中的子字段。例如,這是兩個(gè)相同的例子:

{"location": {"city": "Omaha"}}
{"location.city": "Omaha"}

如果對象的鍵包含句號,則可以使用反斜杠進(jìn)行轉(zhuǎn)義,即

{"location\\.city": "Omaha"}

請注意,這里需要雙反斜杠來編碼實(shí)際的單反斜杠。

第二個(gè)重要的語法元素是使用美元符號($)前綴來表示運(yùn)算符。例如:

{"age": {"$gt": 21}}

在這個(gè)例子中創(chuàng)建了布爾表達(dá)式 age > 21 。

大多數(shù)形式是隱式運(yùn)算符

在大多數(shù)情況下,每個(gè)操作員必須具有該形式{"$operator": argument}。雖然選擇器有兩個(gè)隱式運(yùn)算符。

首先,任何不是條件運(yùn)算符參數(shù)的JSON對象都是 $and 每個(gè)字段的隱式運(yùn)算符。例如,這兩個(gè)例子是相同的:

{"foo": "bar", "baz": true}
{"$and": [{"foo": {"$eq": "bar"}}, {"baz": {"$eq": true}}]}

所以任何包含沒有運(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 的查詢語言 Mango ,具體可以查看https://github.com/cloudant/mango

一個(gè)Couchdb豐富查詢實(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"`   //云證編號
	CloudCardPerson   string `json:"cloudCardPerson"`   //存證方
	CloudCardPlatform string `json:"cloudCardPlatform"` //傳證平臺(tái)
	Time              int64  `json:"time"`              //存證時(shí)間
	BlockNumber       string `json:"blockNumber"`       //存證區(qū)塊號
	CloudCardHash     string `json:"cloudCardHash"`     //存證hash
	FileType          string `json:"fileType"`          //文件類型
	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豐富查詢selector語法有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前題目:HyperledgerFabric中couchdb豐富查詢selector語法有哪些
當(dāng)前鏈接:http://muchs.cn/article28/jpdcjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、虛擬主機(jī)、小程序開發(fā)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)