MongoDB聚合:$changeStreamSplitLargeEvent

这篇具有很好参考价值的文章主要介绍了MongoDB聚合:$changeStreamSplitLargeEvent。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

变更流(Change stream)允许应用访问数据实时变更情况,应用可以使用变更流订阅集合、数据库甚至整个部署的数据变化并直接跟它们进行交互。因为变更流使用了聚合框架,所以应用也可以筛选特定的变化并灵活的转换通知。

如果变更流的事件超过16M,将返回BSONObjectTooLarge异常。不过从7.0开始,MongoDB提供了$changeStreamSplitLargeEvent阶段,支持把事件拆分成多个小的片段。在必要时应该使用$changeStreamSplitLargeEvent,例如应用需要整个文档的pre-imagespost-images,并且产生的大事件超过了16MB,就应该使用$changeStreamSplitLargeEvent

在决定使用$changeStreamSplitLargeEvent之前,应该先尝试降低变更事件的大小,例如:

  • 若非必要,不要请求pre-imagespost-images文档,在大多数情况下会生成fullDocumentfullDocumentBeforeChange字段,它们通常是变更事件最大的对象。
  • 使用$project只选取应用需要的字段,这可以减小变更事件的大小并避免把大事件拆分为片段时耗费过多的时间,也就可以一次返回更多的变更事件。

聚合管道中只能有一个$changeStreamSplitLargeEvent,而且必须放在管道的最后,$changeStreamSplitLargeEvent只能用于$changeStream管道。

语法

{
  $changeStreamSplitLargeEvent: {}
}

$changeStreamSplitLargeEvent会把超过16MB的事件分割成多个片段,并使用变更流游标按顺序返回这些片段。分割片段时,会在第一个片段中返回最大数量的字段,这样可以确保尽快返回事件上下文。分割变更事件时,只使用顶层字段的大小。$changeStreamSplitLargeEvent不会递归处理或分割子文档。例如,如果使用$project阶段创建一个单字段大小为 20MB的变更事件,则该事件不会被拆分,而是会返回错误信息。

每个片段都有一个恢复标记。使用片段令牌恢复的数据流有以下两种情况:

  • 从后续片段开始新的数据流。
  • 如果从序列中的最后一个片段恢复,则从下一个事件开始。

事件的每个片段都包含一个splitEvent文档:

splitEvent: {
   fragment: <int>,  //片段索引,从1开始
   of: <int>         //片段中事件总数
}

举例

下面的示例显示了$changeStreamSplitLargeEvent在集合myCollection中的使用。创建myCollection并插入一个数据量略低于16MB的文档:

db.myCollection.insertOne(
   { _id: 0, largeField: "a".repeat( 16 * 1024 * 1024 - 1024 ) } //largeField 包含重复的字母 a。
)

启用myCollection$changeStreamPreAndPostImages,允许变更流检索更新前(pre-image)和更新后(post-image)的文档:

db.runCommand( {
   collMod: "myCollection",
   changeStreamPreAndPostImages: { enabled: true }
} )

使用db.collection.watch()创建一个变化流游标,用于监控myCollection的变化:

myChangeStreamCursor = db.myCollection.watch(
   [ { $changeStreamSplitLargeEvent: {} } ],
   { fullDocument: "required", fullDocumentBeforeChange: "required" }
)

对于变更流事件:

  • fullDocument:“required” 包含post-image文档
  • fullDocumentBeforeChange:“required” 包含pre-image文档

更新myCollection的文档,这也会产生一个包含文档pre-imagepost-image的变更流事件:

db.myCollection.updateOne(
   { _id: 0 },
   { $set: { largeField: "b".repeat( 16 * 1024 * 1024 - 1024 ) } }
)

largeField \现在包含重复的字母b

使用next()方法从myChangeStreamCursor中读取片段,并将片段存储在名为 firstFragmentsecondFragmentthirdFragment的对象中:

const firstFragment = myChangeStreamCursor.next()
const secondFragment = myChangeStreamCursor.next()
const thirdFragment = myChangeStreamCursor.next()

显示firstFragment.splitEvent

firstFragment.splitEvent

输出片段详细信息:

splitEvent: { fragment: 1, of: 3 }

类似的,secondFragment.splitEventthirdFragment.splitEvent返回:

splitEvent: { fragment: 2, of: 3 }
splitEvent: { fragment: 3, of: 3 }

检查firstFragment对象的键:

Object.keys( firstFragment )

输出:

[
   '_id',
   'splitEvent',
   'wallTime',
   'clusterTime',
   'operationType',
   'documentKey',
   'ns',
   'fullDocument'
]

检查firstFragment.fullDocument的字节大小:

bsonsize( firstFragment.fullDocument )

输出:

16776223

secondFragment包含fullDocumentBeforeChange pre-image,大小约为 16MB。下面的示例显示了secondFragment对象的键:

Object.keys( secondFragment )

输出:

[ '_id', 'splitEvent', 'fullDocumentBeforeChange' ]

thirdFragment``包含updateDescription字段,大小约为16MB。下面的示例显示了thirdFragment对象的键:

Object.keys( thirdFragment )

输出:文章来源地址https://www.toymoban.com/news/detail-787700.html

[ '_id', 'splitEvent', 'updateDescription' ]

到了这里,关于MongoDB聚合:$changeStreamSplitLargeEvent的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MongoDB聚合:$collStats

    聚合阶段 $collStates 用于返回集合或视图统计信息。 $collStats 接收一个文档参数,可选的字段如下: latencyStats 延迟统计信息 向返回结果添加延迟统计信息,包括读、写、命令、事务的时间。 latencyStats.histograms 延迟统计柱状图数据 当值为 true 时,向 latencyStats 内嵌文档中添加

    2024年01月19日
    浏览(31)
  • [Mongodb 5.0]聚合操作

     本文对应Aggregation Operations — MongoDB Manual    正文 此章节主要介绍了Aggregation Pipeline,其实就是将若干个聚合操作放在管道中进行执行,每一个聚合操作的结果作为下一个聚合操作的输入,每个聚合指令被称为一个stage。 在正式开始学习聚合操作前,请先按照下面的方式在你

    2024年02月12日
    浏览(48)
  • MongoDB聚合操作

    提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 单一作用聚合 :提供了对常见聚合过程的简单访问,操作都从单个集合聚合文档。 函数 描述 db.collection.estimatedDocumentCount() 忽略查询条件,返回集合或视图中所有文档的计数 db.collection.count() 返回与find()集合或视

    2024年02月03日
    浏览(31)
  • 整理mongodb文档:聚合管道

    整理mongodb文档:聚合管道 个人博客,求关注,电脑版看体验更加,如果不够清晰,请指出来,谢谢 文章主要通过几个常用的聚合表达式来介绍聚合管道的使用,以及从索引的角度来介绍聚合管道的限制,让大家对聚合管道有一个理解。 聚合操作处理数据记录和 return 计算结果

    2024年02月11日
    浏览(35)
  • MongoDB聚合:$count

    $count 阶段用于统计管道中文档的数量。 string 是文档计数输出字段的名称。 string 必须是非空字符串,不能以 $ 开头,也不能包含 . 字符。 $count 阶段相当于下面 $group + $project 聚合序列: 其中 myCount 是包含计数的输出字段。也可以为输出字段指定其他名称。 \\\"scores\\\"的集合有以

    2024年02月02日
    浏览(33)
  • MongoDB聚合操作:$changeStream

    返回集合、数据库或整个群集上的 Change Stream 游标。必须在聚合管道的第一阶段使用。 allChangesForCluster 可选:设置Change Stream是否包括群集中的所有更改。可能只能在管理数据库中打开。 fullDocument 可选:指定 update 操作修改时,更改通知是否包含完整文档的副本。 default :更

    2024年01月23日
    浏览(37)
  • MongoDB聚合:$project

    $project 聚合阶段可将输入文档根据请求的字段输出到管道的下个阶段,输出的字段可以是输入文档中的字段,也可以是新的计算字段。 $project 聚合接受一个文档参数,可以指定包含的字段,抑制 _id 字段,添加新的字段以及重置已有字段的值等。亦或者,也可以指定排除的字

    2024年02月20日
    浏览(22)
  • MongoDB聚合:$bucketAuto

    按照指定的表达式对输入文档进行分类后放入指定数字的桶中,跟 $bucket 不太一样, $bucketAuto 可以指定分组的数量(颗粒度), $bucketAuto 会根据 groupBy 的值和颗粒度自动生成桶的边界。 groupBy 表达式,对文档进行分组的表达式。若指定字段路径,需要在字段名前加上美元符

    2024年01月21日
    浏览(30)
  • MongoDB聚合:$limit

    限制传递到管道下一阶段的文档数量。 $limit 正整数,指定要传递的最大文件数。 注意: 从 MongoDB 5.0 开始,使用 $limit 管道聚合具有 64 位整数限制。传递给管道的值如果超过此限制,将返回无效参数错误。 当使用 $sort 聚合阶段或 $sort() 方法,以及 findAndModify 命令或 findAnd

    2024年01月18日
    浏览(21)
  • MongoDB聚合:$graphLookup

    $graphLookup 聚合阶段在一个集合中执行递归搜索,可以使用选项来控制递归搜索的深度和条件。 $graphLookup 搜索过程总结如下: 输入文档进入 $graphLookup 聚合阶段。 $graphLookup 的搜索目标是 from 参数指定的集合(搜索参数的完整列表见下文)。 对于每个输入文档,搜索都从 st

    2024年02月20日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包