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
修改文档。当连接器进程,改变一个
完整的文档,它查询集合。与此同时,变化b
和c
发生。当连接器收到响应变化的查询完整的文档一个
,它可能会收到一个版本的文档是基于后续更改b
或c
。有关更多信息,请参见的文档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连接器表示一个数据库开云体育官方注册网址文档,其中包含一个数组,包括异构数据类型:开云体育电动老虎机
{" _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连接器。消息包含一个字段的文档一个
两个嵌套文档包含字段,b
和c
:
{" _id ": 1,“a”: {“b”: 1、“c”:“没有一个”},“d”: 100}
消息在下面的例子显示了输出的SMT MongoDB趋于平缓的嵌套结构在前面的信息:
{" _id ": 1、“a_b”: 1、“a_c”:“没有”,“d”: 100}
在生成的消息,b
和c
字段被嵌套在原始消息被夷为平地,重命名。形成的重命名字段连接父文档的名称一个
嵌套文档的名称:a_b
和a_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
。
假设一个连接器配置捕获完整的文档,当ExtractNewDocumentState
SMT收到一个更新
消息的美元的设置
事件,SMT一直代表删除字段的信息零
值,如以下示例所示:
{" id ": 1,“a”:零}
连接器不配置为捕获完整的文档,当SMT接收到一个更新事件的美元的设置
操作,它将生成以下输出信息:
{“a”:零}
确定原始操作
SMT趋于平缓事件消息后,生成的消息不再表明操作是否生成的事件类型创建
,更新
或初始快照读
。通常,您可以识别删除
操作通过配置连接器暴露墓碑或重写事件伴随信息删除。更多信息配置连接器暴露信息墓碑和重写事件消息,看到drop.tombstones
和delete.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平缓结构(结构)在最初的事件消息连接消息中嵌套的属性的名称,由一个可配置的分隔符分开,形成一个简单的字段名。 |
|
|
当 |
|
|
开云体育官方注册网址为每个Debezium生成一个墓碑记录 |
|
|
指定SMT处理如何改变Debezium生成的事件记录开云体育官方注册网址
|
|
__(双下划线) |
这个可选字符串前缀头。 |
|
没有默认的 |
指定一个以逗号分隔,没有空间,你希望SMT的元数据字段添加到简化的头信息。当原始消息包含重复的字段名称,您可以识别特定字段修改通过提供结构体的名称加上字段的名称,例如, 可选地,您可以覆盖的原始名称字段并为其分配一个新名字通过添加一个条目列表按以下格式:
例如:
您所指定的新名字值是区分大小写的。 |
|
__(双下划线) |
指定一个可选的字符串字段名称的前缀。 |
|
没有默认的 |
这个选项设置为一个以逗号分隔,没有空间,元数据字段添加到
例如:
您所指定的新名字值是区分大小写的。 当SMT将元数据字段添加到 |