MongoDB新文档状态提取

此SMT仅支持MongoDB连接器。看到提取源记录状态从Debezium开云体育官方注册网址改变事件对应于此SMT的关系数据库。开云体育电动老虎机

Debe开云体育官方注册网址zium MongoDB连接器以复杂消息结构的形式生成数据。该信息由两部分组成:

  • 操作和元数据

  • 对于插入,执行插入后的全部数据;用于更新描述已更改字段的补丁元素

而且补丁元素是包含插入/修改数据的JSON表示的字符串。例如,插入事件的一般消息结构是这样的:

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

中提供了有关消息结构的更多详细信息的文档MongoDB连接器。

虽然这种结构非常适合表示对MongoDB的无模式集合的更改,但现有的接收器连接器(如Confluent JDBC接收器连接器)并不理解它。

因此Debezium开云体育官方注册网址提供了一个单个消息转换(SMT)转换/补丁将来自MongoDB CDC事件的信息转换为适合现有接收器连接器使用的结构。为此,SMT解析JSON字符串并从中重建正确类型的Kafka Connect记录(包括正确的消息有效负载和模式),然后这些记录可以被JDBC接收器连接器等连接器使用。

使用JSON作为发出的记录结构的可视化,上面的事件是这样的:

{"field1": "newvalue1", "field2": "newvalue2"}

SMT应应用在接收器连接器上。

配置

配置是sink任务连接器的一部分,用一组属性表示:

变换=打开……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 Connect(或Apache Avro)模式定义的数组。问题是这样的数组必须包含相同类型的元素。MongoDB允许用户将不同类型的元素存储到相同的数组中。为了绕过这种阻抗不匹配,可以用两种不同的方式对数组进行编码array.encoding配置选项。

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

价值数组(默认值)将数组编码为数组数据类型。用户有责任确保给定数组实例的所有元素都是相同类型的。这个选项有一定的限制,但是可以方便下游客户端处理数组。

价值文档将数组转换为结构体结构体用类似的方法做的BSON序列化.主要的结构体包含命名为_0_1_2等等,其中名称表示数组中元素的索引。然后将每个元素作为给定字段的值传递。

让我们假设一个示例源MongoDB文档,其中包含具有异构类型的数组

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

该文档将被编码为

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

此选项允许您处理任意数组,但使用者需要知道如何正确处理它们。

注意:索引名中出现下划线,因为Avro编码要求字段名不以数字开头。

嵌套结构扁平化

当MongoDB文档包含一个嵌套的文档(结构)时,它被忠实地编码为一个嵌套的结构字段。如果接收器连接器仅支持扁平结构,则可以将内部结构扁平为具有一致字段命名的扁平结构。要启用此功能,请使用该选项flatten.struct必须设置为真正的

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

生成的平面文档将由字段组成,这些字段的名称是通过连接父字段的名称和嵌套文档中字段的名称创建的。这些元素用一个选项定义的字符串分隔struct.delimiter默认设置为下划线

让我们假设一个示例源MongoDB文档,其中的字段包含一个嵌套文档

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

该文件将被编码为

{"_id": 1, "a_b": 1, "a_c": "none", "d": 100}

此选项允许您将分层文档转换为适合于类表存储的平面结构。

MongoDB美元的设置处理

MongoDB允许美元的设置从文档中删除某个字段的操作。因为集合是无模式的,所以很难通知消费者/下沉者现在缺少的字段。Debezium使用的方法是将要删除开云体育官方注册网址的字段设置为空值。

给定这个操作

{“后”:零,“补丁”:“{\“设置美元\”:{\“\”:真}}"}

最终的编码看起来像这样

{"id": 1, "a": null}

注意,其他MongoDB操作可能会导致美元的设置在内部,美元重命名就是一个例子。

确定原始操作

当消息被平摊时,最终结果不会显示它是插入、更新还是首次读取。(删除可以通过墓碑或重写来检测,请参见配置选项.)

为了解决这个问题,你可以传播原始的操作作为一个字段添加到消息值或作为一个头属性,例如像这样使用一个头属性:

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

可能的值是人事处领域的MongoDB连接器更改事件

添加元数据字段

SMT可以选择将原始更改事件的元数据字段添加到最终平铺记录(前缀为“__”)。这种向事件记录添加元数据的能力使得包含内容成为可能,例如与变更事件关联的集合的名称,或者特定于连接器的字段,如复制集名称。目前,只有来自change事件子结构的字段事务而且updateDescription可添加。有关MongoDB更改事件结构的详细信息,请参见的文档用于MongoDB连接器。

例如,您可以指定以下配置来添加一个副本集名称(rs)和最终扁平事件记录的变更事件的集合名称:

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

上面的配置导致以下内容被添加到平坦的记录中:

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

删除事件时,仅当delete.handling.mode选项设置为重写

选择性地应用转换的选项

除了发生数据库更改时Debezium连接器发出的更改事件消息外,连接器还发出其他类型的消息,包括开云体育官方注册网址心跳消息和关于模式更改和事务的元数据消息。开云体育电动老虎机因为这些其他消息的结构与SMT设计用来处理的更改事件消息的结构不同,所以最好将连接器配置为选择性地应用SMT,以便它只处理预期的数据更改消息。

有关如何有选择地应用SMT的更多信息,请参见为转换配置SMT谓词

配置选项

财产 默认的 描述

数组

SMT将MongoDB数组转换为Apache Connect(或Apache Avro)模式定义的数组。

SMT通过使用一个可配置的分隔符将字段连接到普通属性中来简化结构。

_

为输出记录生成字段名时,用于在输入记录的字段名之间连接的分隔符。仅适用于以下情况flatten.struct设置为真正的

真正的

SMT从流中删除Debezium生成的墓碑。开云体育官方注册网址

下降

SMT可以下降重写或通过删除记录(没有一个).的重写模式将添加__deleted字段设置为真正的这取决于所表示的操作。

__(双下划线)

将此可选字符串设置为标题的前缀。

指定要添加到扁平消息头部的元数据字段列表。如果字段名重复(例如:"ts_ms"存在两次),则应该指定结构体以获得正确的字段(例如。“source.ts_ms”)。字段将以____ < struct > __,这取决于结构体的规格。请使用逗号分隔列表,不带空格。

__(双下划线)

将此可选字符串设置为字段的前缀。

指定要添加到扁平消息的元数据字段列表。如果字段名重复(例如:"ts_ms"存在两次),则应该指定结构体以获得正确的字段(例如。“source.ts_ms”)。字段将以____ < struct > __,这取决于结构体的规格。请使用逗号分隔列表,不带空格。

是否对字段名进行消毒以符合Avro命名要求。看到Avro命名欲知详情。

已知的限制

  • 根据定义,将数据更改从无模式存储(如MongoDB)传输到严格基于模式的数据存储(如关系数据库)只能在一定范围内工作。开云体育电动老虎机具体来说,一个集合中具有相同名称的文档的所有字段必须具有相同的类型。否则,无法在目标数据库中获得一致的列定义。开云体育电动老虎机

  • 数组将在Kafka Connect记录中正确地恢复,但是接收器连接器不支持它们,只是期望一个“扁平”的消息结构。