kafka连接器debezium mongodb CDC update/$set无过滤器消息(_id值)

kafka连接器debezium mongodb CDC update/$set无过滤器消息(_id值),mongodb,apache-kafka-connect,debezium,mongodb-oplog,Mongodb,Apache Kafka Connect,Debezium,Mongodb Oplog,我正在尝试使用debezium mongodb连接器设置从mongodb到kudu的同步。但正如debezium doc告诉我的,我自己也尝试过,发现debezium mongodb CDC update/$set消息没有过滤器(_id值) { "after": null, "patch": "{\"$v\" : 1,\"$set\" : {\"_upts_ratio_average_points\" : {\"$numberLong\" : \"1564645156749\"}

我正在尝试使用debezium mongodb连接器设置从mongodb到kudu的同步。但正如debezium doc告诉我的,我自己也尝试过,发现debezium mongodb CDC update/$set消息没有过滤器(_id值)

{
    "after": null,
    "patch": "{\"$v\" : 1,\"$set\" : {\"_upts_ratio_average_points\" : {\"$numberLong\" : \"1564645156749\"},\"updatets\" : {\"$numberLong\" : \"1564645156749\"}}}",
    "source": {
        "version": "0.9.5.Final",
        "connector": "mongodb",
        "name": "promongodbdeb05",
        "rs": "mgset-13056897",
        "ns": "strtest.mg_jsd_result_all",
        "sec": 1564645156,
        "ord": 855,
        "h": -1570214265415439167,
        "initsync": false
    },
    "op": "u",
    "ts_ms": 1564648181536
}

我不明白为什么这样设计,没有过滤器真的不知道哪个文件是更新。我下载了这个连接器的源代码并试图修复它。它看起来像是class
io.debezium.connector.mongodb.transforms.UnwrapFrommongodbenDevelope
就是在这里用这样的代码提取mongodb操作日志消息的。这个文件混淆了
\u id
id
操作,看起来连接器的提交者确实试图在CDC更新消息中包含
\u id
值。我试图更改
valueDocument.append(“id”),keyDocument.get(“id”)
valueDocument.append(“id”,keyDocument.get(“_id”)仍然没有
\u id

熟悉debezium的人能帮我吗

{
    private BsonDocument getUpdateDocument(R patchRecord, BsonDocument keyDocument) {
        BsonDocument valueDocument = new BsonDocument();
        BsonDocument document = BsonDocument.parse(patchRecord.value().toString());

        if (document.containsKey("$set")) {
            valueDocument = document.getDocument("$set");
        }

        if (document.containsKey("$unset")) {
            Set<Entry<String, BsonValue>> unsetDocumentEntry = document.getDocument("$unset").entrySet();

            for (Entry<String, BsonValue> valueEntry : unsetDocumentEntry) {
                // In case unset of a key is false we don't have to do anything with it,
                // if it's true we want to set the value to null
                if (!valueEntry.getValue().asBoolean().getValue()) {
                    continue;
                }
                valueDocument.append(valueEntry.getKey(), new BsonNull());
            }
        }

        if (!document.containsKey("$set") && !document.containsKey("$unset")) {
            if (!document.containsKey("_id")) {
                throw new ConnectException("Unable to process Mongo Operation, a '$set' or '$unset' is necessary " +
                        "for partial updates or '_id' is expected for full Document replaces.");
            }
            // In case of a full update we can use the whole Document as it is
            // see https://docs.mongodb.com/manual/reference/method/db.collection.update/#replace-a-document-entirely
            valueDocument = document;
            valueDocument.remove("_id");
        }

        if (!valueDocument.containsKey("id")) {
            valueDocument.append("id", keyDocument.get("id"));
        }

        if (flattenStruct) {
            final BsonDocument newDocument = new BsonDocument();
            valueDocument.forEach((fKey, fValue) -> newDocument.put(fKey.replace(".", delimiter), fValue));
            valueDocument = newDocument;
        }

        return valueDocument;
    }

}
我搜索并发现其他人可以获得debezium mongodb CDC,如本文所示: 这样地: { 在“:{\”\u id\”:{\“$oid\”:\“58385328e4b001431e4e497a\”之后


你可以看到我无法获得
\u id
,因此我无法知道在哪个文档/记录上的更改,但对于上面的帖子,作者似乎可以获得
\u id
,也可以通过检查code,
\u id
应该在那里。我使用了
0.9.5Final
和上面帖子中使用的
0.7.4 rev
。都没有运气对我来说,总是没有_id值。

当消费者讨论主题时,需要添加
--property key.print=true
。它会有键。值在键的部分。谢谢你,嗨,你能举一个消息的示例,看看它现在是什么样子,并将它与一个示例并排比较一下你需要如何看它吗?@jiri,我的评论很长,所以在问题中发布。非常感谢您的帮助,也在debezium官方文档中,也没有类似的_-id。但是作为我找到的帖子和我检查的源代码,_-id应该在那里,对我来说真的很困惑。{“schema”:{…},“payload”:{“op”:“u”,“ts_-ms”:1465491461815,“patch”:“{\”$set\:{”first_name\“:\“Anne Marie\”}”,CDC官方更新示例,你可以在发现另一个stackoverflow帖子中找到,问的问题与我的问题完全相同:非常感谢你的反馈,jiri,我添加了“delete.handling.mode”:“rewrite”,但我的mongodb删除操作仍然没有消息,有什么问题吗?
{ "after": null, "patch": "{\"$v\" : 1,\"$set\" : {\"_upts_ratio_average_points\" : {\"$numberLong\" : \"1564645156749\"},\"updatets\" : {\"$numberLong\" : \"1564645156749\"}}}", "source": { "version": "0.9.5.Final", "connector": "mongodb", "name": "promongodbdeb05", "rs": "mgset-13056897", "ns": "strtest.mg_jsd_result_all", "sec": 1564645156, "ord": 855, "h": -1570214265415439167, "initsync": false }, "op": "u", "ts_ms": 1564648181536 }