MongoDB新文档状态提取

Debe开云体育官方注册网址zium MongoDB连接器排放数据变化信息来表示每个操作,出现在MongoDB集合。这些事件消息的复杂结构忠实地代表原始数据库事件的细节。开云体育电动老虎机然而,一些下游的消费者可能无法处理的消息在其原始格式。例如,表示嵌套文档数据收集,连接器会发出事件消息的格式,包括嵌套的字段。支持水槽连接器,或其他消费者无法处理的层次化格式原始消息,您可以使用Debezium MongoDB事件压扁(ExtractNewDocumentState)单一消息转换(SMT)。开云体育官方注册网址原始消息的SMT简化了结构,并可以修改消息在其他方面使数据处理更容易。

是一个事件压扁转换卡夫卡连接贴片

本章描述了事件中的信息扁平化单一消息转换(SMT)仅供Debezium MongoDB连接器。开云体育官方注册网址为一个等价的SMT信息使用关系数据库,查看开云体育电动老虎机为新记录状态文档提取SMT

改变事件结构

Debe开云体育官方注册网址zium MongoDB连接器生成事件,有一个复杂的结构变化。每个事件消息包括以下部分:

元数据来源

包括但不限于以下领域:

  • 改变数据类型的操作集合中(创建/插入、更新或删除)。

  • 数据库的名称和收集的改变开云体育电动老虎机发生。

  • 时间戳来标识更改时间。

  • 可选的事务信息。

文档数据
之前数据

这个领域存在于环境中运行MongoDB 6.0和以后capture.mode对于Debezi开云体育官方注册网址um连接器设置为以下值之一:

  • change_streams_with_pre_image

  • change_streams_update_full_with_pre_image

    有关更多信息,请参见MongoDB原像支持

数据

JSON字符串表示的值出现在一个文档后,当前的操作。的存在在一个事件消息的类型取决于事件和连接器配置。一个创建事件的MongoDB插入操作总是包含一个领域,不管capture.mode设置。为更新事件,只有当字段是礼物capture.mode设置为以下值之一:

  • change_streams_update_full

  • change_streams_update_full_with_pre_image

    价值变化事件消息并不一定代表文档事件后的状态。价值不是动态计算;相反,连接器捕捉更改事件后,它将查询集合检索文档的当前值。

    例如,假设这样一种情况:多个操作,一个,b,c修改文档。当连接器进程,改变一个完整的文档,它查询集合。与此同时,变化bc发生。当连接器收到响应变化的查询完整的文档一个,它可能会收到一个版本的文档是基于后续更改bc。有关更多信息,请参见的文档capture.mode财产。

下面的片段显示了基本的结构创建更改事件连接器发出后MongoDB插入操作:

{“人事处”:“c”,“后”:“{\“field1 \”, \“newvalue1 \”, \“field2 \”, \“newvalue1 \“}”,“源”:{…}}

的复杂的格式在前面的示例中提供了详细信息的变化发生在源数据库。开云体育电动老虎机然而,一些消费者不能处理消息包含嵌套的值。将复杂的嵌套原始消息到一个更简单、更普遍的结构,使用事件压扁SMT MongoDB。SMT平缓的结构嵌套在消息字段,如以下示例所示:

{“field1”:“newvalue1”、“field2”:“newvalue2”}

对于更多信息默认消息的结构由Debezium MongoDB连接器,看到开云体育官方注册网址连接器的文档

行为

MongoDB提取事件压扁SMT字段创建更新改变Debezium MongoDB连接器发出的事件消息。开云体育官方注册网址SMT流程原始更改事件消息后,它生成一个简化版本只包含的内容字段。

取决于你的用例,您可以应用ExtractNewDocumentState SMT Debezium MongoDB连接器,或水槽连接器使用Debezium连接器生开云体育官方注册网址产的消息。如果你应用SMT Debezium MongoDB连接器开云体育官方注册网址,连接器的SMT修改消息发出之前发送到Apache卡夫卡。确保卡夫卡保留完整的Debezium改变原来的事件消息格式,应用SMT水槽连接器。开云体育官方注册网址

当你使用事件压扁SMT处理消息发出MongoDB连接器,SMT转换结构的正确记录在原始消息类型卡夫卡连接记录,可以使用一个典型的连接器。例如,SMT将JSON字符串表示原始消息到模式中的信息结构,任何消费者可以处理。

可选地,您可以配置的事件压扁SMT MongoDB来修改消息处理过程中在其他方面。有关更多信息,请参见配置主题

配置

配置事件平整(ExtractNewDocumentState) SMT MongoDB水槽连接器使用的消息发出的Debezium MongoDB连接器。开云体育官方注册网址

基本配置

获取默认行为的SMT、SMT添加到水槽的配置连接器不指定任何选项,如以下示例:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState

与任何卡夫卡连接连接器配置,您可以设置变换=多个,用逗号分隔,SMT别名。卡夫卡连接应用转换,您指定的顺序列出。

你可以设置多个选项压扁SMT连接器使用MongoDB的事件。下面的例子展示了一个配置设置drop.tombstones,delete.handling.mode,add.headers选择一个连接器:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.drop。墓碑= false transforms.unwrap.delete.handling.mode =下降transforms.unwrap.add.headers = op

关于配置选项的更多信息在前面的例子中,看到的配置主题

自定义配置

连接器可能发出许多类型的事件消息(例如,心跳消息,墓碑消息,或元数据信息事务)。转换应用于事件的一个子集,您可以定义SMT谓词选择性地应用转换的语句特定事件。

数组编码

默认情况下,事件压扁SMT MongoDB数组转换成数组,兼容Apache卡夫卡连接,或Apache Avro模式。在MongoDB数组可以包含多种类型的元素,卡夫卡数组中的所有元素必须是相同类型的。

确保SMT编码阵列的方式满足您的环境的需要,您可以指定array.encoding配置选项。下面的例子显示了设置数组编码的配置:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.array.encoding = <数组|文档>

根据配置,SMT流程的每个实例数组在源信息通过使用下列编码方法之一:

数组编码

如果array.encoding被设置为数组(默认),SMT编码使用数组数组数据类型编码的原始消息。确保正确的处理,数组中所有元素必须是相同类型的实例。这个选项是一个限制,但它使下游客户轻松地处理数组。

文档编码

如果array.encoding被设置为文档,SMT源中的每个数组转换成结构体结构体的方式类似BSON序列化。主要的结构体包含字段命名_0,_1,_2等等,每个字段名代表原始数组中的一个元素的索引。SMT填充这些索引字段的值,它检索等效源数组中的元素。与强调名称前缀索引,因为Avro编码禁止以数字字符的字段名称。

下面的例子显示了如何Debezium MongoDB连接器表示一个数据库开云体育官方注册网址文档,其中包含一个数组,包括异构数据类型:开云体育电动老虎机

例1。例如:文档编码包含多个数据类型的数组
{" _id ": 1、“a1”: [{“a”: 1、“b”:“没有一个”},{“a”:“c”,“d”:“东西”}]}

如果array.encoding被设置为文档,SMT将前面的文档转换为以下格式:

{" _id ": 1, " a1 ": {" _0 ": {“a”: 1、“b”:“没有一个”},“_1”:{“a”:“c”,“d”:“东西”}}}

文档编码选项允许的SMT加工任意阵列组成的异质元素。然而,在你使用这个选项之前,总是确认水槽连接器和其他下游消费者有能力处理数组,包含多个数据类型。

嵌套结构压扁

当一个数据库操开云体育电动老虎机作涉及嵌入式文档,Debezium MongoDB连接器发出卡夫卡事件记录的结构,反映了原始文档的层次结构。开云体育官方注册网址即事件消息表示嵌套文档为一组嵌套结构。下游的环境中包含嵌套结构的连接器不能处理消息,您可以配置事件压扁SMT扁平层次结构的信息。一个平坦的消息结构更适合类似于表的存储。

配置SMT平嵌套结构,设置flatten.struct配置选项真正的。构造的转换信息,字段名称保持一致与文档的来源。的SMT重命名每个夷为平地字段连接父文档的名称字段与嵌套文档的名称字段。定义的分隔符flatten.struct.delimiter选择分离的组件名称。的默认值struct.delimiter是下划线字符(_)。

下面的例子显示了指定的配置是否SMT趋于平缓嵌套结构:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.flatten。struct = <真|假> transforms.unwrap.flatten.struct.delimiter = <字符串>

下面的示例显示了一个事件消息所发出的MongoDB连接器。消息包含一个字段的文档一个两个嵌套文档包含字段,bc:

{" _id ": 1,“a”: {“b”: 1、“c”:“没有一个”},“d”: 100}

消息在下面的例子显示了输出的SMT MongoDB趋于平缓的嵌套结构在前面的信息:

{" _id ": 1、“a_b”: 1、“a_c”:“没有”,“d”: 100}

在生成的消息,bc字段被嵌套在原始消息被夷为平地,重命名。形成的重命名字段连接父文档的名称一个嵌套文档的名称:a_ba_c。新字段名称的组件使用下划线分隔字符,所定义的设置struct.delimiter配置属性,

MongoDB美元的设置处理

在MongoDB,美元的设置运营商和美元重命名运营商都是从一个文档删除字段。因为MongoDB集合是无模式,从一个文档更新删除字段后,不可能推断出失踪的名称字段的更新文档。支持水槽连接器或其他消费者可能需要删除的信息字段,Debezium发出更新消息,包括开云体育官方注册网址removedFields元素列表删除字段的名称。

下面的示例显示了一个操作的一部分更新消息,结果删除的字段一个:

“有效载荷”:{“人事处”:“u”,“ts_ms”:“……”“之前”:“{…}”、“后”:“{…}”、“updateDescription”: {“removedFields”:“a”,“updatedFields”:空,“truncatedArrays”:零}}

在前面的例子中,之前代表源文档的状态之前和之后的文档更新。这些字段存在于连接器发出只有在事件消息capture.mode中描述的连接器设置为下面的列表:

之前

前提供文档的状态变化。只有当这个字段是礼物capture.mode设置为以下值之一:

  • change_streams_with_pre_image

  • change_streams_update_full_with_pre_image

提供完整的文档的状态变化。只有当这个字段是礼物capture.mode设置为以下值之一:

  • change_streams_update_full

  • change_streams_update_full_with_pre_image

假设一个连接器配置捕获完整的文档,当ExtractNewDocumentStateSMT收到一个更新消息的美元的设置事件,SMT一直代表删除字段的信息值,如以下示例所示:

{" id ": 1,“a”:零}

连接器不配置为捕获完整的文档,当SMT接收到一个更新事件的美元的设置操作,它将生成以下输出信息:

{“a”:零}

确定原始操作

SMT趋于平缓事件消息后,生成的消息不再表明操作是否生成的事件类型创建,更新或初始快照。通常,您可以识别删除操作通过配置连接器暴露墓碑或重写事件伴随信息删除。更多信息配置连接器暴露信息墓碑和重写事件消息,看到drop.tombstonesdelete.handling.mode属性。

报告的类型数据库操作在一个事件消息,SMT可以添开云体育电动老虎机加一个人事处领域之一以下元素:

  • 事件消息体。

  • 一个消息头。

例如,要添加一个标题属性显示原来的操作的类型,添加变换,然后添加add.headers连接器配置属性,如以下示例:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.add.headers = op

基于前面的配置,SMT报告添加一个事件类型人事处头的消息,并给它分配一个字符串值来确定类型的操作。基于指定的字符串值人事处在原始字段值MongoDB改变事件消息

添加元数据字段

事件压扁SMT, MongoDB可以添加元数据字段从最初的变化事件消息的简化信息。以双下划线前缀添加元数据字段(“_”)。将元数据添加到事件记录可以包括内容等的集合的名称更改事件发生,或以包括连接器特有的字段,如副本集名称。目前,SMT只能从以下更改事件次级架构添加字段:,事务updateDescription

有关MongoDB改变事件结构的更多信息,见MongoDB连接器文档

例如,您可以指定以下配置添加副本集名称(rs)和集合名称改变事件最终被夷为平地事件记录:

变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.add.fields = rs,收藏

前面的配置导致以下内容被添加到扁平的记录:

{“__rs”:“rs0”、“__collection”:“我的收藏”,…}

如果你想要添加元数据字段的SMT删除事件,设置的值delete.handling.mode选项重写

选项有选择地应用转换

除了改变事件消息,Debezium连接器排放数据库变化发生时,连接器还散发出其他类型的消息,包括开云体育官方注册网址心跳消息,和元数据信息模式变化和事务。开云体育电动老虎机因为这些消息的结构不同于SMT的改变事件消息的结构设计过程,最好配置连接器有选择地应用SMT,这样流程只有预期的数据变化信息。

为更多的信息关于如何有选择地应用SMT,明白了配置一个SMT谓词转换

配置选项

下表描述的配置选项MongoDB事件压扁SMT。

财产 默认的 描述

数组

指定格式,SMT使用当它编码阵列读取从最初的事件消息。设置以下选项之一:

数组

SMT使用数组数据类型编码MongoDB数组的格式与Apache卡夫卡连接或Apache Avro兼容模式。如果您设置这个选项,确认每个数组中的元素是相同类型的实例。尽管MongoDB允许数组包含多个数据类型,一些下游客户无法处理数组。

文档

SMT每个MongoDB数组转换成结构体结构体的方式类似BSON序列化。主要的结构体包含字段的名称_0,_1,_2,等等。遵守Avro命名标准,每个索引字段的SMT前缀数字名称和下划线。每一个数字字段名称代表原始数组中的一个元素的索引。SMT填充这些索引字段的值,它从源文档检索指定的数组元素。

更多的信息array.coding选项,请参阅在MongoDB事件消息选项编码阵列

SMT平缓结构(结构)在最初的事件消息连接消息中嵌套的属性的名称,由一个可配置的分隔符分开,形成一个简单的字段名。

_

flatten.struct被设置为真正的指定的分隔符转换之间插入字段名称,它连接的输入记录生成输出记录的字段名称。

真正的

开云体育官方注册网址为每个Debezium生成一个墓碑记录删除操作。默认行为是该事件压扁SMT从流中删除墓碑记录。保留墓碑记录在流,指定drop.tombstones = false

下降

指定SMT处理如何改变Debezium生成的事件记录开云体育官方注册网址删除操作。设置以下选项之一:

下降

SMT删除记录删除事件流的操作。

没有一个

SMT保留原来的更改事件记录的事件流。记录只包含“价值”:“零”

重写

SMT保留修改版本的更改事件记录流。提供另一种方式来表明,记录被删除,修改后的记录包含一个价值字段包含键/值对,从原始记录,并补充说__deleted:真价值

如果你设置重写更新选项,您可能会发现,简化的记录删除操作是足够的跟踪记录删除。在这种情况下,您可能希望SMT把墓碑记录

__(双下划线)

这个可选字符串前缀头。

没有默认的

指定一个以逗号分隔,没有空间,你希望SMT的元数据字段添加到简化的头信息。当原始消息包含重复的字段名称,您可以识别特定字段修改通过提供结构体的名称加上字段的名称,例如,source.ts_ms

可选地,您可以覆盖的原始名称字段并为其分配一个新名字通过添加一个条目列表按以下格式:

< field_name >:< new_field_name >

例如:

版本:版本,连接器:连接器,source.ts_ms: EVENT_TIMESTAMP

您所指定的新名字值是区分大小写的。

当SMT添加元数据字段的头简化信息,它以双下划线前缀每个元数据字段名称。结构规范,SMT也插入一个下划线之间的结构体名和字段名。

如果您指定一个字段,不在改变事件原始消息,SMT不添加字段标题。

__(双下划线)

指定一个可选的字符串字段名称的前缀。

没有默认的

这个选项设置为一个以逗号分隔,没有空间,元数据字段添加到价值元素的简化卡夫卡消息。当原始消息包含重复的字段名称,您可以识别特定字段修改通过提供结构体的名称加上字段的名称,例如,source.ts_ms
可选地,您可以覆盖的原始名称字段并为其分配一个新名字通过添加一个条目列表按以下格式:

< field_name >:< new_field_name >

例如:

版本:版本,连接器:连接器,source.ts_ms: EVENT_TIMESTAMP

您所指定的新名字值是区分大小写的。

当SMT将元数据字段添加到价值简化消息的元素,它以双下划线前缀每个元数据字段名称。结构规范,SMT也插入一个下划线之间的结构体名和字段名。

如果你指定一个字段没有出现在原始的改变事件消息,SMT仍将指定的字段添加到价值元素的修改信息。

已知的限制

  • 因为MongoDB是无模式数据库,以确保一致的列定义当你使用De开云体育电动老虎机bezium基于数据流变化关系数据库,字段集合中具有相同的名称必须相同类型的数据存储。开云体育官方注册网址

  • 配置SMT生产信息的格式兼容水槽连接器。如果一个水槽连接器需要一个“平”的消息结构,但它接收一条消息编码源MongoDB文档的结构体数组的结构、水槽连接器不能处理消息。