Ruby操作MongoDB(進階七)-定序Collations

來源:互聯網
上載者:User

標籤:collations   定序   aggregation   彙總操作   

本篇博文從三個方面進行定序Collations的講解。其中包括概覽,使用方式和支援排序的操作。首先我們對定序進行一個概覽性的介紹

  1. 定序概覽

   定序為特定語言習慣中的字串比較提供一套規則,例如,在加拿大法語中,給定詞彙的最後一個重音節決定了其排序次序。

   考慮下述法語詞彙: 

cote < coté < cte < cté

   使用加拿大法語定序,得到如下排序結果

cote < cte < coté < cté

如果沒有指定定序,MongoDB使用簡單的二進位比較排序。按照這樣的規則,上述單詞的排序結果是

cote < coté < cte < cté

2. 定序的使用

   建立集合和建立索引時,我們可以指定預設的定序,也可以為集合及彙總的CRUD操作指定定序。對於支援定序的操作,如果沒有指定不同的定序,MongoDB會使用預設的定序。

   定序參數

‘collation‘ => {   ‘locale‘ => <string>,   ‘caseLevel‘ => <bool>,   ‘caseFirst‘ => <string>,   ‘strength‘ => <int>,   ‘numericOrdering‘ => <bool>,   ‘alternate‘ => <string>,   ‘maxVariable‘ => <string>,   ‘normalization‘ => <bool>,   ‘backwards‘ => <bool>}

   唯一一個必須設定的參數是locale。伺服器會將該參數轉換為一個 ICU format locale ID。例如,將locale值設定為en_US 代表美式英語,fr_CA 代表加拿大法語。完整的參數值可以查看 MongoDB manual entry。

2.1 為集合指定定序

      下面的執行個體在test資料庫上建立了一個contacts的集合,並且給其分配了預設的locale值為fr_CA定序。建立集合的時候指定一個定序,確保了集合contacts上包含查詢在內的所有操作都會使用fr_CA定序,除非操作指定了特定的定序。建立集合上的索引也會繼承預設的定序,除非建立索引時指定了其他的定序。

client=Mongo::Client.new([‘127.0.0.1:27017‘],:database=>‘test‘)client[:contacts,{"collation"=>{"locale"=>"fr_CA"}}]

2.2 為索引指定定序

     為索引指定定序,可以在建立索引的時候指定collation參數,下面的執行個體在名為address_book集合的name欄位域(first_name)上建立索引,並設定為唯一索引,同時設定了預設的定序的locale屬性為en_US。

client=Mongo::Client.new([‘127.0.0.1:27017‘],:database=>‘test‘)client[:address_book].indexes.create_one({"first_name"=>1},                                          "unique"=>true,                                          "collation"=>{ "locale" => "en_US" }                                          )

為了使用該索引,你必須確保你所用的查詢中也指定了這種定序,下面的查詢使用上面定義的索引

client[:address_book].find({"first_name"=>"Adam"},                            "collation"=>{ "locale" => "en_US" })

而下面的這種查詢就無法使用上面定義的索引,第一種情況是沒有定義排序集合collation屬性;第二種情況是排序集合上多指定了一個strength屬性

client[:address_book].find({"first_name"=>"Adam"})client[:address_book].find({"first_name"=>"Adam"},                            "collation"=>{"locale"=>"en_US","strength"=>2})

3 支援定序的操作

   MongoDB資料庫中,所有的查詢,更新和刪除方法均支援定序。下面列出了一些常用方法:
3.1 find和sort方法

    在查詢結果和排序的時候,單個查詢可以指定定序。下面的查詢排序的例子,通過將collation的locale屬性設定為de,設定該查詢排序使用基於德語的定序

client=Mongo::Client.new([‘127.0.0.1:27017‘],:database=>"test")client[:contacts].find({"city"=>"New York"},{"collation"=>{"locale"=>"de"}}).sort({"name"=>1})

  3.2 find_one_and_update方法    

    假設一個集合names中包含了以下文檔:

{ "_id" : 1, "first_name" : "Hans" }{ "_id" : 2, "first_name" : "Gunter" }{ "_id" : 3, "first_name" : "Günter" }{ "_id" : 4, "first_name" : "Jürgen" }

    下面的find_one_and_update操作沒有指定定序:

client=Mongo::Client.new([‘127.0.0.1:27017‘],:database=>‘test‘)doc=client[:names].find_one_and_update({"first_name"=>{"$lt"=>"Gunter"}},{"$set"=>{"verified"=>true}})

由於Gunter 是集合文檔中的第一個詞彙,所以上述查詢結果為空白,也不會更新任何文檔。同樣的find_one_and_update方法,但是指定了排序組合,locle屬性設定了[email protected]=phonebook.

對於區分專有名詞和其他詞彙區別的語言,有些locale屬性包含collation=phonebook選擇性參數。設定了collation=phonebook的定序,有母音變音的字元會在沒有母音變音字元之前返回。

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")doc = client[:names].find_one_and_update( { "first_name" => { "$lt" => "Gunter" } },  { "$set" => { "verified" => true } }, { "collation" => { "locale" => "[email protected]=phonebook" },:return_document => :after } )

上述操作後的結果如下:

{ "_id" => 3, "first_name" => "Günter", "verified" => true }

3.2 find_one_and_update方法

   通過將numericOrdering 參數設定true可以使用比較數字型字串,比較的方式就是使用字串對應的數值。例如numbers集合包含下面的文檔:

{ "_id" : 1, "a" : "16" }{ "_id" : 2, "a" : "84" }{ "_id" : 3, "a" : "179" }

下面的例子是找到一個包含數字型欄位的且數值大於100的文檔,並且刪除它

docs=find_one_and_deletes({"a"=>{"$gt"=>100}},{"collation"=>{"locale"=>"end","numericOrdering"=>true}})

執行了上述操作後,文檔中的

{ "_id" : 1, "a" : "16" }{ "_id" : 2, "a" : "84" }

仍然存在,但是

{ "_id" : 3, "a" : "179" }

被刪除了。

 但是如果同樣的操作,卻不使用定序。那麼伺服器會找到a的詞彙值大於100的第一個文檔並且刪除它。

這時,文檔中的第一個被刪除了。查詢後的結果如下:

{ "_id" : 2, "a" : "84" }{ "_id" : 3, "a" : "179" }

3.3 多條刪除delete_many()

    Ruby驅動中所有的大量操作都可以使用定序參數。假設集合recipes 包含下面的文檔:

{ "_id" : 1, "dish" : "veggie empanadas", "cuisine" : "Spanish" }{ "_id" : 2, "dish" : "beef bourgignon", "cuisine" : "French" }{ "_id" : 3, "dish" : "chicken molé", "cuisine" : "Mexican" }{ "_id" : 4, "dish" : "chicken paillard", "cuisine" : "french" }{ "_id" : 5, "dish" : "pozole verde", "cuisine" : "Mexican" }

設定collation中的strength 為1或者2,可以讓伺服器在查詢過濾器運行時忽略大小寫,下面的案例使用不區分大小寫查詢過濾器來進行cuisine 欄位匹配了French的文檔的刪除操作。

client=Mongo::Cient.new([‘127.0.0.1:27017‘],:database=>‘test‘)receipes=client[:receipes]docs=delete_many({"cusine"=>"French"},{"collation"=>{"locale"=>"en_US","strength"=>1}})

執行上述指令後,_id值為2和4的文檔被刪除掉了。

3.4 彙總Aggregation

    在集合上進行彙總操作,需要設定collation的aggregation欄位。下面的彙總執行個體使用了一個名為names的集合并且將first_name域分到一組,計算了每個分組的結果文檔數,而且通過German phonebook進行排序。

   

aggregation=names.aggregate([{"$group"=>{"$_id"=>"$first_name","name_count"=>{"$sum"=>1}}},{"$sort"=>{"$id"=>1}}],{"collection"=>{"locale"=>"[email protected]=phonebook"}})aggregation.each do |doc|  p docend


本文出自 “techFuture” 部落格,謝絕轉載!

Ruby操作MongoDB(進階七)-定序Collations

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.