`

MongoDB Capped Collections & Custom Collation

阅读更多

 

capped collections 固定集合

 

  • 支持高吞吐量操作:根据插入顺序插入和检索文档。
  • 工作方式类似循环缓冲区:当分配给集合的空间用完,新插入的数据就会覆盖最旧的数据。
  • 可使用 MongoDB 的 TTL 索引(生存时间)替代固定集合,设置 TTL 索引值 & 日期类型字段值 使数据过期并删除。TTL 索引与固定集合不兼容。
  • 插入速度极快,查询输出速度极快,插入最新数据时,淘汰最早的数据。
  • 插入顺序:可确保插入顺序,因此查询不需要索引即可按插入顺序返回文档,没有索引开销,支持更高插入吞吐量。
  • 自动删除最旧文件:无需脚本 or 显式删除操作,自动删除最旧文档给新文档腾出空间。潜在用例:
    1、存储大容量系统生成的日志信息。
    在没有索引的情况下,将文档插入固定集合中的速度接近将日志信息直接写入文件系统的速度。
    此外,内置的先进先出属性可在管理存储使用的同时维护事件的顺序。
    2、在固定集合中缓存少量数据。
    由于读取的是高速而非繁重的缓存,因此您要么需要确保此集合始终保留在工作集中(即在RAM中),要么需要对所需的一个或多个索引进行写惩罚。
     例如,将操作日志存储在副本集中的oplog.rs集合使用了固定集合。从MongoDB 4.0开始,固定集合的操作日志可以超出其配置的大小限制,以避免删除多数提交点。
  • _id 索引:固定集合默认具有 _id 字段和 _id 字段上的索引。
  • 限制和推荐:
    1.更新:若要更新固定集合中的文档,请创建索引,以便更新操作无需集合扫描。
    2.文件大小:如果更新或替换操作更改了文档大小,则该操作将失败。
    3.文件删除:无法删除固定集合中的文档。 只能使用 drop() 方法删除集合并重新创建固定集合。
    4.分片:无法将固定集合分片。
    5.查询效率:使用自然顺序可以有效地从集合中检索最近插入的元素,类似于日志文件。
    6.集合:聚合管道阶段 $out 无法将结果写入固定集合。
    7.事务:从MongoDB 4.2开始,无法在事务中写数据到固定集合,但仍支持读取数据。
  • 创建固定集合
    通过 db.createCollection() 方法( mongo shell 中 create 命令)创建固定集合,必须指定集合的​​最大大小(以字节为单位),MongoDB 将为该集合预先分配最大大小。固定集合的大小包括少量内部开销空间。
    db.createCollection( "log", { capped: true, size: 100000 } )
    如果 size <= 4096,则集合的上限为4096字节。否则 MongoDB 将提高大小使其成为 256 的整数倍。
    此外,您还可使用 max 字段为集合指定最大文档数,如下所示:
    db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
    即使指定最大文档数,也始终需要 size 参数。如果集合在达到最大文档数之前达到最大大小限制,MongoDB 将删除较旧的文档。
  • 固定集合查询
    如果您在未指定顺序的固定集合上执行 find(),则 MongoDB 保证结果的顺序与插入顺序相同。
    要以相反的插入顺序检索文档,请发出 find().sort() 方法并将 $natural 参数设置为 -1,如下所示:
    db.cappedCollection.find().sort( { $natural: -1 } )
  • 检查集合是否为固定集合
    db.collection.isCapped()
  • 将一个集合转换为固定集合
    db.runCommand({"convertToCapped": "mycoll", size: 100000});
    size 参数以字节为单位指定固定集合的大小。
    在操作期间,它将持有数据库排他锁。 锁定同一数据库的其他操作将被阻止,直到该操作完成。
    请参阅一些常见的客户端操作采取了哪些锁定? 用于锁定数据库的操作。
    下表列出了一些操作以及它们用于文档级锁定存储引擎的锁定类型:
    Operation Database Collection
    Issue a query r (Intent Shared) r (Intent Shared)
    Insert data w (Intent Exclusive) w (Intent Exclusive)
    Remove data w (Intent Exclusive) w (Intent Exclusive)
    Update data w (Intent Exclusive) w (Intent Exclusive)
    Perform Aggregation r (Intent Shared) r (Intent Shared)
    Create an index (Foreground) W (Exclusive) no
    Create an index (Background) w (Intent Exclusive) w (Intent Exclusive)
    List collections r (Intent Shared), Changed in version 4.0. no
    Map-reduce W (Exclusive) and R (Shared) w (Intent Exclusive) & r (Intent Shared)
  • 结尾游标
    可将可结尾游标与固定集合一起使用。与 Unix tail -f 命令类似,结尾游标跟随在固定集合的末尾。 将新文档插入固定集合后,可使用结尾游标继续获取该文档。
    有关创建可尾光标的信息,请参见可尾光标。

 

Use Custom Collation 自定义排序

 

  • 排序允许用户为 String 比较指定特定于语言的规则,如字母大写和重音符号的规则。您可以为集合或视图,索引或支持归类的特定操作指定排序。
  • 文档排序规则
    {
    locale: <string>,
    caseLevel: <boolean>,
    caseFirst: <string>,
    strength: <int>,
    numericOrdering: <boolean>,
    alternate: <string>,
    maxVariable: <string>,
    backwards: <boolean>
    }
    指定排序规则时,locale (区域设置) 字段是必填字段; 所有其他排序规则字段都是可选的。
    默认排序规则参数值取决于您指定的语言环境。

    字段类型说明:
    locale: ICU 语言环境。有关支持的语言环境的列表,请参见支持的语言和语言环境。要指定简单的二进制比较,请将语言环境值指定为“ simple”。

    caseLevel: 强度。可选的。要执行的比较级别。对应于 ICU 比较级别。可能的值为:
    1 - 主要比较。排序规则仅对基本字符进行比较,忽略其他区别,如变音符号和大小写。
    2 - 二级比较。排序规则执行基本字符(主要区别)和变音符号(次要区别)的比较。基本字符之间的差异优先于次要差异。
    3 - 第三层比较。这是默认级别。排序规则将比较基本字符(主要差异),变音符号(次要差异)以及大小写和变体(三次差异)。优先级别依次递减。
    4 - 第四级。限于特定用例,以在1-3级忽略标点符号或处理日语文本时考虑标点符号。
    5 - 相同级别。仅限于平局决胜局的特定用例。
    有关详细信息,请参见 ICU 整理:比较级别。

    caseLevel: 可选的。默认值为false。确定是否包括强度级别1或2的案例比较的标志。
    如果为 true,则包括案例比较;即
    当与 strength=1 一起使用时,排序规则比较基本字符和大小写。
    当使用强度为 2 时,排序规则比较基本字符,变音符号(以及其他可能的次要差异)和大小写。
    如果为false,则不包括级别 1 或 2 的大小写比较。
    有关更多信息,请参阅ICU整理:案例级别。

    caseFirst:可选的。默认值为 off。在第三级比较期间确定大小写差异的排序顺序的字段。
    可能的值为:
    “ upper”:大写在小写之前排序。
    “ lower”:小写在大写之前排序。
    “ off”:类似于“下部”,略有不同。
    有关差异的详细信息,请参见http://userguide.icu-project.org/collat​​ion/customization。

    numericOrdering:可选的。默认为 false。确定将数字字符串比较为数字还是字符串的标志。
    如果为 true,则比较为数字;否则为0。即“ 10”大于“ 2”。
    如果为 false,则比较为字符串;否则为false。即“ 10”小于“ 2”。

    alternate:可选的。默认值为“non-ignorable”。确定排序规则是否应将空格和标点符号视为基本字符以便进行比较的字段。可能的值为:
    “non-ignorable” 空格和标点符号被视为基本字符。
    “ shifted” 空格和标点符号不视为基本字符,仅在强度级别大于 3 时才可区分。
    有关更多信息,请参见ICU整理:比较级别。

    maxVariable:可选的。确定在交替显示时哪些字符可忽略的字段:“ shifted”。如果交替显示,则无效:“non-ignorable”。可能的值为:
    “punct” 空格和标点符号都是“ ignorable”,即不被视为基本字符。
    “ space” 空格是“ ignorable”,即不被视为基本字符。

    backwards:可选的。默认值为 false。用于确定是否带有变音符号的字符串从字符串的后面进行排序的标志,例如某些法语词典的排序。
    如果为 true,则从后到前进行比较。
    如果为 false,则从前到后进行比较。

    normalization:可选的。默认值为 false。用于确定是否检查文本是否需要规范化并执行规范化的标志。通常大多数文本不需要此规范化处理。
    如果为 true,请检查是否完全标准化,然后执行标准化以比较文本。
    如果为 false,则不检查。

    有关详细信息,请参见http://userguide.icu-project.org/collat​​ion/concepts#TOC-Normalization。
  • 支持排序的操作
    您可以为以下操作指定排序规则:
    注意您不能为一个操作指定多个排序规则。 例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。
    Commands mongo Shell Methods
    create db.createCollection(),db.createView()
    createIndexes [1] db.collection.createIndex() [1]
    aggregate db.collection.aggregate()
    distinct db.collection.distinct()
    findAndModify db.collection.findAndModify(),db.collection.findOneAndDelete(),db.collection.findOneAndReplace(),db.collection.findOneAndUpdate()
    find cursor.collation() to specify collation for db.collection.find()
    mapReduce db.collection.mapReduce()
    delete db.collection.deleteOne(),db.collection.deleteMany(),db.collection.remove()
    update db.collection.update(),db.collection.updateOne(),db.collection.updateMany(),db.collection.replaceOne()
    shardCollection sh.shardCollection()
    count db.collection.count()
    Individual update, replace, and delete operations in db.collection.bulkWrite().

    某些索引类型不支持排序规则。 有关详细信息,请参见排序规则和不支持的索引类型。
     
  • 本地变体:某些排序规则语言环境具有变体,这些变体采用特定于语言的规则。要指定语言环境变体,请使用以下语法:
    { "locale" : "<locale code>@collation=<variant>" }
    例如,要使用中文排序规则的 unihan 变体:
    { "locale" : "zh@collation=unihan" }
     有关所有归类语言环境及其变体的完整列表,请参见归类语言环境。
  • 排序规则和视图:
  • 您可以在创建时为视图指定默认排序规则。如果未指定排序规则,则视图的默认排序规则为“简单”二进制比较排序规则。也就是说,该视图不会继承该集合的默认排序规则。
  • 视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将失败,并显示错误。
  • 如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
  • 如果执行涉及多个视图的聚合,例如使用 $ lookup 或 $ graphLookup,则这些视图必须具有相同的排序规则。
  • 使用排序规则和索引:要将索引用于字符串比较,操作还必须指定相同的排序规则。即,具有排序规则的索引不能支持对索引字段进行字符串比较的操作(如果该操作指定了不同的排序规则)。
    例如,集合 myColl 在具有排序规则区域设置 “ fr” 的字符串字段类别中具有索引。
    db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

    以下查询操作指定与索引相同的排序规则,可以使用索引:
    db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

    但是,以下查询操作(默认情况下使用 “simple” 二进制整理程序)不能使用索引:
    db.myColl.find( { category: "cafe" } )
     对于索引前缀键不是字符串,数组和嵌入式文档的复合索引,指定不同排序规则的操作仍可以使用索引来支持索引前缀键的比较。
    例如,集合 myColl 在数字字段 score 和 price 和字符串字段类别上具有复合索引;使用排序规则语言环境 “ fr” 创建索引以进行字符串比较:
    db.myColl.createIndex(
    { score: 1, price: 1, category: 1 },
    { collation: { locale: "fr" } } )

    以下使用 “simple” 二进制排序规则进行字符串比较的操作可以使用索引:
    db.myColl.find( { score: 5 } ).sort( { price: 1 } )
    db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

    以下操作将 “simple” 二进制排序规则用于索引类别字段上的字符串比较,该操作可以使用索引仅满足分数:查询的5部分:
    db.myColl.find( { score: 5, category: "cafe" } )
  • 排序规则和不支持的索引类型:以下索引仅支持简单的二进制比较,不支持排序规则:文字索引、二维索引、geoHaystack索引。要在具有非简单排序规则的集合上创建文本索引,二维索引或 geoHaystack 索引,您必须在创建索引时显式指定 {collat​​ion:{locale:“ simple”}}} 。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics