MongoDB新文档状态提取
Debe开云体育官方注册网址zium MongoDB连接器发出数据更改消息,以表示MongoDB集合中发生的每个操作。这些事件消息的复杂结构忠实地表示了原始数据库事件的详细信息。开云体育电动老虎机但是,一些下游使用者可能无法以原始格式处理消息。例如,为了表示数据集合中的嵌套文档,连接器以包含嵌套字段的格式发出事件消息。为了支持接收器连接器或其他不能处理原始消息的分层格式的使用者,您可以使用Debezium MongoDB事件扁平化(ExtractNewDocumentState)单个消息转换(SMT)。开云体育官方注册网址SMT简化了原始消息的结构,并且可以以其他方式修改消息,从而使数据更容易处理。
事件扁平化变换是Kafka连接SMT.
本章中的信息仅描述Debezium MongoDB连接器的事件扁平化单消息转换(SMT)。开云体育官方注册网址有关用于关系数据库的等效SMT的信息,请参见开云体育电动老虎机用于新记录状态提取SMT的文档. |
改变事件结构
Debe开云体育官方注册网址zium MongoDB连接器生成具有复杂结构的变更事件。每个事件消息包括以下部分:
- 元数据来源
-
包括但不限于以下字段:
更改集合中数据的操作类型(创建/插入、更新或删除)。
发生更改的数据库和集合的开云体育电动老虎机名称。
标识更改时间的时间戳。
可选的事务信息。
- 文档数据
-
-
之前
数据 -
此字段出现在运行MongoDB 6.0及更高版本的环境中
capture.mode
为Debeziu开云体育官方注册网址m连接器设置为以下值之一:change_streams_with_pre_image
.change_streams_update_full_with_pre_image
.有关更多信息,请参见MongoDB -pre-image-support[MongoDB预镜像支持。
-
后
数据 -
表示当前操作之后出现在文档中的值的JSON字符串。存在
后
事件消息中的字段取决于事件类型和连接器配置。一个创建
事件插入
操作总是包含后
场,不管之capture.mode
设置。为更新
事件,后
字段仅在capture.mode
设置为以下值之一:change_streams_update_full
change_streams_update_full_with_pre_image
.的
后
更改事件消息中的值不一定表示紧跟事件之后的文档状态。该值不是动态计算的;相反,在连接器捕获变更事件之后,它会查询集合以检索文档的当前值。例如,想象一种情况,有多个操作,
一个
,b
,c
快速连续修改文档。当连接器处理时,更改一个
,它会查询集合以获取完整的文档。与此同时,变化b
而且c
发生。当连接器接收到对其完整文档查询的响应以进行更改时一个
时,它可能会接收到基于的后续更改的文档版本b
或c
.有关的详细信息,请参阅capture.mode
财产。
-
的基本结构创建
连接器在MongoDB之后发出的change事件插入
操作:
{“人事处”:“c”,“后”:“{\“field1 \”,\“newvalue1 \”,\“field2 \”,\“newvalue1 \“}”,“源”:{…}}
的复杂格式后
上例中的字段提供有关源数据库中发生的更改的详细信息。开云体育电动老虎机但是,一些使用者不能处理包含嵌套值的消息。要将原始消息的复杂嵌套字段转换为更简单、更普遍兼容的结构,请使用MongoDB的事件扁平化SMT。SMT扁平化消息中嵌套字段的结构,如下例所示:
{"field1": "newvalue1", "field2": "newvalue2"}
有关Debezium MongoDB连接器生成的消息的默认结构的更多信息,请参见开云体育官方注册网址连接器的文档.
行为
事件扁平化SMT为MongoDB提取后
字段创建
或更新
由Debezium MongoDB连接器发出的change事件消息。开云体育官方注册网址类的内容后,SMT会生成一个简化版本后
字段。
根据您的用例,您可以将ExtractNewDocumentState SMT应用于Debezium MongoDB连接器,或者应用于消耗Debezium连接器产生开云体育官方注册网址的消息的接收器连接器。如果将SMT应用到Debezium MongoDB连接器开云体育官方注册网址,SMT将修改连接器发出的消息,然后再将它们发送到Apache Kafka。为了确保Kafka以原始格式保留完整的Debezium更改事件消息,将SMT应用到接开云体育官方注册网址收器连接器。
当您使用事件扁平化SMT处理从MongoDB连接器发出的消息时,SMT将原始消息中的记录结构转换为可由典型接收器连接器使用的正确类型的Kafka Connect记录。例如,SMT转换表示的JSON字符串后
将原始消息中的信息转换为任何使用者都可以处理的模式结构。
可选地,您可以为MongoDB配置事件扁平化SMT,以便在处理期间以其他方式修改消息。有关更多信息,请参见配置.
配置
为使用Debezium MongoDB连接器发出的消息的接收器连接器配置MongoDB的事件平坦化(ExtractNewDocumentState) SMT。开云体育官方注册网址
基本配置
要获得SMT的默认行为,可以将SMT添加到sink connector的配置中,不需要指定任何选项,示例如下:
变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState
与任何Kafka Connect连接器配置一样,您可以设置变换=
到多个逗号分隔的SMT别名。Kafka Connect应用你指定的转换,按照它们列出的顺序。
您可以为使用MongoDB事件扁平化SMT的连接器设置多个选项。属性的配置drop.tombstones
,delete.handling.mode
,add.headers
连接器的选项:
变换=打开……transforms.unwrap.type = i开云体育官方注册网址o.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.drop。Tombstones =false transforms.unwrap.delete. handle .mode=drop transforms.unwrap.add.headers=op
有关上述示例中的配置选项的详细信息,请参见配置选项
连接器可能发出多种类型的事件消息(例如,心跳消息、墓碑消息或关于事务的元数据消息)。若要将转换应用于事件的子集,可以定义选择性地应用转换的SMT谓词语句仅用于特定事件。
数组编码
默认情况下,事件扁平化SMT将MongoDB数组转换为与Apache Kafka Connect或Apache Avro模式兼容的数组。MongoDB数组可以包含多种类型的元素,而Kafka数组中的所有元素必须是同一类型。
为确保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”:“东西”}}}
的文档
encoding选项使SMT能够处理由异构元素组成的任意数组。但是,在使用此选项之前,请始终验证接收器连接器和其他下游使用者是否能够处理包含多种数据类型的数组。
嵌套结构扁平化
当数据库操作涉开云体育电动老虎机及嵌入式文档时,Debezium MongoDB连接器会发出一个Kafka事件记录,该事件记录的结构反映了原开云体育官方注册网址始文档的层次结构。也就是说,事件消息将嵌套文档表示为一组嵌套字段结构。在下游连接器无法处理包含嵌套结构的消息的环境中,您可以配置事件扁平化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}
以下示例中的消息显示了MongoDB的SMT将前面消息中的嵌套结构平坦化后的输出:
{"_id": 1, "a_b": 1, "a_c": "none", "d": 100}
在结果消息中,b
而且c
原始消息中嵌套的字段被平铺并重命名。重命名的字段是通过连接父文档的名称形成的一个
使用嵌套文档的名称:a_b
而且a_c
.属性的设置所定义的新字段名的组件由下划线字符分隔struct.delimiter
配置属性,
MongoDB美元的设置
处理
在MongoDB中,美元的设置
操作员和美元重命名
操作符都从文档中删除字段。因为MongoDB集合是无模式的,在更新从文档中删除字段后,不可能从更新的文档中推断缺失字段的名称。为了支持接收器连接器或其他可能需要关于已删除字段的信息的使用者,Debezium发出更新消息,其中包含开云体育官方注册网址removedFields
元素,该元素列出已删除字段的名称。
下面的示例显示了导致删除字段的操作的更新消息的一部分一个
:
“有效载荷”:{“人事处”:“u”,“ts_ms ": "...", " 前”:“{…}", "after": "{…}", "updateDescription": {"removedFields": ["a"], "updatedFields": null, "truncatedArrays": null}}
在上面的例子中,之前
而且后
表示源文档在更新文档之前和之后的状态。属性时,连接器发出的事件消息中才会出现这些字段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": null}
的更新事件时,对于未配置为捕获完整文档的连接器,SMT将接收到美元的设置
操作时,它产生以下输出消息:
{"a": null}
确定原始操作
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更改事件消息.
添加元数据字段
MongoDB的事件扁平化SMT可以将原始更改事件消息中的元数据字段添加到简化消息中。添加的元数据字段以双下划线(“_”
).向事件记录添加元数据可以包括内容,例如发生更改事件的集合的名称,或者包括特定于连接器的字段,例如复制集名称。目前,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通过连接消息中嵌套属性的名称(由可配置的分隔符分隔)来简化原始事件消息中的结构(struct),以形成一个简单的字段名。 |
|
|
当 |
|
|
开云体育官方注册网址Debezium为每一个生成一个墓碑记录 |
|
|
指定SMT如何处理Debezium为之生成的更改事件记录开云体育官方注册网址
|
|
__(双下划线) |
将此可选字符串设置为标题的前缀。 |
|
没有默认的 |
指定一个以逗号分隔、不带空格的元数据字段列表,您希望SMT将这些字段添加到简化消息的报头中。当原始消息包含重复的字段名时,您可以通过提供结构的名称和字段的名称来识别要修改的特定字段,例如, 可选地,您可以覆盖字段的原始名称,并通过向列表中添加以下格式的条目来为其分配一个新名称:
例如:
指定的新名称值区分大小写。 |
|
__(双下划线) |
指定一个可选字符串作为字段名的前缀。 |
|
没有默认的 |
属性的元数据字段列表,以逗号分隔,不带空格
例如:
指定的新名称值区分大小写。 属性中添加元数据字段时 |