Ruby操作MongoDB(进阶七)-排序规则Collations
2017-08-16 18:57
429 查看
本篇博文从三个方面进行排序规则Collations的讲解。其中包括概览,使用方式和支持排序的操作。首先我们对排序规则进行一个概览性的介绍
排序规则概览
排序规则为特定语言习惯中的字符串比较提供一套规则,例如,在加拿大法语中,给定词汇的最后一个重音节决定了其排序顺序。
考虑下述法语词汇:
使用加拿大法语排序规则,得到如下排序结果
如果没有指定排序规则,MongoDB使用简单的二进制比较排序。按照这样的规则,上述单词的排序结果是
2. 排序规则的使用
创建集合和创建索引时,我们可以指定默认的排序规则,也可以为集合及聚合的CRUD操作指定排序规则。对于支持排序规则的操作,如果没有指定不同的排序规则,MongoDB会使用默认的排序规则。
排序规则参数
为了使用该索引,你必须确保你所用的查询中也指定了这种排序规则,下面的查询使用上面定义的索引
本篇博文从三个方面进行排序规则Collations的讲解。其中包括概览,使用方式和支持排序的操作。首先我们对排序规则进行一个概览性的介绍
排序规则概览
排序规则为特定语言习惯中的字符串比较提供一套规则,例如,在加拿大法语中,给定词汇的最后一个重音节决定了其排序顺序。
考虑下述法语词汇:
cote < coté < cte < cté
使用加拿大法语排序规则,得到如下排序结果
cote < cte < coté < cté
如果没有指定排序规则,MongoDB使用简单的二进制比较排序。按照这样的规则,上述单词的排序结果是
cote < coté < cte < cté
2. 排序规则的使用
创建集合和创建索引时,我们可以指定默认的排序规则,也可以为集合及聚合的CRUD操作指定排序规则。对于支持排序规则的操作,如果没有指定不同的排序规则,MongoDB会使用默认的排序规则。
排序规则参数
唯一一个必须设定的参数是locale。服务器会将该参数转换为一个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"=>] 而下面的这种查询就无法使用上面定义的索引,第一种情况是没有定义排序集合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,设定该查询排序使用基于德语的排序规则,:database=>] 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操作没有指定排序规则:,:database=>'test') doc=client[:names].find_one_and_update({"first_name"=>{"$lt"=>] 由于.Gunter是集合文档中的第一个词汇,所以上述查询结果为空,也不会更新任何文档。同样的find_one_and_update方法,但是指定了排序组合,locle属性设置了[code]de@collation=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" => "de@collation=phonebook" },:return_document => :after } ) [/code] 上述操作后的结果如下:3.2 find_one_and_update方法 通过将numericOrdering参数设置true可以使用比较数字型字符串,比较的方式就是使用字符串对应的数值。例如numbers集合包含下面的文档:
[code]{ "_id" : 1, "a" : "16" }
{ "_id" : 2, "a" : "84" }
{ "_id" : 3, "a" : "179" }
下面的例子是找到一个包含数字型字段的且数值大于100的文档,并且删除它执行了上述操作后,文档中的{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
仍然存在,但是被删除了。 但是如果同样的操作,却不使用排序规则。那么服务器会找到a的词汇值大于100的第一个文档并且删除它。 这时,文档中的第一个被删除了。查询后的结果如下:3.3 多条删除delete_many() Ruby驱动中所有的批量操作都可以使用排序规则参数。假设集合[code]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的文档的删除操作。,:database=>'test') receipes=client[:receipes] docs=delete_many({"cusine"=>] 执行上述指令后,_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"=>"de@collation=phonebook"}}) aggregation.each do |doc| p doc end
相关文章推荐
- Ruby操作MongoDB(进阶六)-索引Indexing
- Ruby操作MongoDB(进阶八)-聚合操作Aggregation
- Ruby操作MongoDB(进阶九)-批量操作Bulk Operations
- Ruby操作MongoDB(进阶十)--文本搜索text search
- Ruby操作MongoDB(进阶十一)--空间信息搜索Geospatial Search
- Ruby操作MongoDB(进阶二)-CRUD操作
- Ruby操作MongoDB(进阶三)-集合collection
- Ruby操作MongoDB(进阶一)-创建数据库客户端连接
- Ruby操作MongoDB(进阶四)-投影Projection
- Ruby操作MongoDB(进阶五)-数据库管理Administration
- 无法解决 equal to 操作的排序规则冲突
- 无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突
- SQL排序规则:无法解决 equal to 操作的排序规则冲突
- java操作mongodb基础(查询 排序 输出list)
- 无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_BIN" 之间的排序规则冲
- 无法解决 equal to 操作中的 **** 和 *******排序规则冲突
- ruby 操作MongoDB
- play framework框架下,连接到MongoDB时的特殊操作(与或查询,模糊查询,范围查询,数据排序等)
- 无法解决 equal to 操作中的 **** 和 *******排序规则冲突
- 无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。