启用了"完整文档"的MongoDB Atlas仅返回更改的项目,而不返回完整文档



我正在尝试将触发器与MongoDB Atlas一起使用,以通知我的集合中文档的更改。我想收到其中有任何数据更改的完整文档,并在收到更改通知后使用该完整文档。在触发器配置中,存在启用/禁用"触发器"的滑块;完整文档";其具有以下描述:

打开"完整文档",您将收到创建的文档或在更改事件中修改。对于Delete操作文档将不存在。

然而,无论是否启用滑块,我都会得到相同的结果。

这是我的变更监听器代码:

const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true  })
await client.connect().then(db => {
const collection = client.db("database_name").collection("collection_name")
const changeStream = collection.watch()
changeStream.on("change", async data => {
console.log("Detected database change on", Date())
console.log(data) // only returns changed data
})
})

以下是示例输出,如上所述,尽管有触发器配置,但它不包括完整的文档:

{
_id: {
_data: '82606C926E000000012B022C0100296E5A10049008F3458DF14719A9225DF7AB403CEC46645F69640064606C76124670930F9A1F657C0004'
},
operationType: 'update',
clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1617728110 },
ns: { db: 'database_name', coll: 'collection_name' },
documentKey: { _id: 606c76124670930f9a1f657c },
updateDescription: {
updatedFields: {
my_data: 'my changed data',
created: 1617728109618
},
removedFields: []
}
}

完整的文档应该是这样的:

{
_id: 606c76124670930f9a1f657c,
myKey: 'something that never changed',
my_data: 'my changed data',
created: 1617728109618,
expires: 'some time in seconds that never changed',
other_info: 'something that never changed'
}

任何帮助都将不胜感激。。。例如,我需要在触发器配置中添加一个函数来返回完整的文档吗?如果是,这样的函数会是什么样子?

我通常不喜欢回答自己的问题,但我想如果其他人需要,我会在这里发布答案。

经过进一步挖掘,看起来collection.watch()可以接受选项。在Atlas中启用了完整文档后,我的代码需要这样:

const changeStream = collection.watch([], { fullDocument: 'updateLookup' })

现在,完整的文档按预期返回。我找到的文件来自这里,也来自这里。

最新更新