排序规则#
参见
API文档 collation
.
排序是MongoDB 3.4版中的一个新功能。它们提供了一组规则,用于比较符合特定语言(如西班牙语或德语)约定的字符串。如果未指定排序规则,服务器将根据二进制比较对字符串进行排序。许多语言都有特定的排序规则,而排序规则允许用户构建遵循特定于语言的比较规则的应用程序。
例如,在法语中,给定单词的最后一个重音决定了排序顺序。以下四个法语单词的正确排序顺序是:
cote < côte < coté < côté
通过指定法语排序规则,用户可以使用法语排序顺序对字符串字段进行排序。
使用#
用户可以为 collection ,一个 index ,或者 CRUD command .
排序规则参数:#
排序规则可以用 Collation
或者使用纯Python字典。结构相同:
Collation(locale=<string>,
caseLevel=<bool>,
caseFirst=<string>,
strength=<int>,
numericOrdering=<bool>,
alternate=<string>,
maxVariable=<string>,
backwards=<bool>)
唯一必需的参数是 locale
,服务器将其解析为 ICU format locale ID 。例如,设置 locale
至 en_US
代表美国英语或 fr_CA
代表加拿大法语。
有关可用参数的完整描述,请参见MongoDB manual .
为集合指定默认排序规则#
下面的示例演示如何创建名为 contacts
并使用 fr_CA
区域设置。此操作可确保针对 contacts
集合使用 fr_CA
除非显式指定另一个排序规则:
from pymongo import MongoClient
from pymongo.collation import Collation
db = MongoClient().test
collection = db.create_collection('contacts',
collation=Collation(locale='fr_CA'))
为索引指定默认排序规则#
创建新索引时,可以指定默认排序规则。
下面的示例演示如何在 name
领域 contacts
集合,与 unique
参数已启用,默认排序规则为 locale
设置为 fr_CA
::
from pymongo import MongoClient
from pymongo.collation import Collation
contacts = MongoClient().test.contacts
contacts.create_index('name',
unique=True,
collation=Collation(locale='fr_CA'))
指定查询的排序规则#
单个查询可以指定排序规则以在对结果排序时使用。下面的示例演示在上运行的查询 contacts
数据库中的集合 test
. 它与包含 New York
在 city
并在 name
字段与 fr_CA
排序规则:
from pymongo import MongoClient
from pymongo.collation import Collation
collection = MongoClient().test.contacts
docs = collection.find({'city': 'New York'}).sort('name').collation(
Collation(locale='fr_CA'))
其他查询类型#
您可以使用排序规则来控制几种不同类型查询的文档匹配规则。所有各种更新和删除方法 (update_one()
, update_many()
, delete_one()
,等等)支持排序规则,您可以创建使用排序规则以符合 locale
参数。
以下示例使用排序规则 strength
设置为 SECONDARY
,例如,它只考虑字符串比较中的基字符和字符重音,而不考虑区分大小写。中的所有文档 contacts
收藏 jürgen
(不区分大小写)在 first_name
字段已更新:
from pymongo import MongoClient
from pymongo.collation import Collation, CollationStrength
contacts = MongoClient().test.contacts
result = contacts.update_many(
{'first_name': 'jürgen'},
{'$set': {'verified': 1}},
collation=Collation(locale='de',
strength=CollationStrength.SECONDARY))