您正在查看过时的Debezium版本的文档。开云体育官方注册网址
如果您想查看本页最新的稳定版本,请前往在这里

MongoDB新文档状态提取

此单个消息转换(SMT)目前正在积极开发中,因此发出的消息结构或其他细节仍可能随着开发的进行而更改。请参见下面对这种转换的已知局限性的描述。

此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.operation.header=true

数组编码

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_c": 1, "a_d": "none", "d": 100}

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

MongoDB美元的设置处理

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

给定这个操作

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

最终的编码看起来像这样

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

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

确定原始操作

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

为了解决这个问题,Debezium提供了一个开云体育官方注册网址选项,通过添加到消息中的头来传播原始操作。要启用此功能,请使用该选项operation.header必须设置为真正的

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

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

添加源元数据字段

SMT可以选择从原始更改事件中添加元数据字段结构转换为最终的平化记录(前缀为“__”)。此功能可用于添加更改事件的集合,或特定于连接器的字段,如复制集名称。有关源结构中可用内容的更多信息,请参见的文档用于MongoDB连接器。

例如,配置

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

将增加

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

到最后的扁平记录。

删除事件时,此选项仅在delete.handling.mode选项设置为“重写”。

配置选项

财产 默认的 描述

数组

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记录中正确地恢复,但是接收器连接器不支持它们,只是期望一个“扁平”的消息结构。