从变更事件文档页面,变更流将输出此文档:
{
_id : { <BSON Object> },
"operationType" : "<operation>",
"fullDocument" : { <document> },
"ns" : {
"db" : "<database>",
"coll" : "<collection"
},
"documentKey" : { "_id" : <ObjectId> },
"updateDescription" : {
"updatedFields" : { <document> },
"removedFields" : [ "<field>", ... ]
}
}
也就是说,如果您在watch()
方法中没有放置任何内容,则该文档将成为输出。
然后,您可以使用聚合管道阶段来过滤/修改此文档。
例如,如果您只想查看插入/更新文档中的字段_id
、a
和b
,则管道将是(使用 Python):
with db.test.watch([
{'$project': {
'fullDocument_id':'$fullDocument._id',
'a':'$fullDocument.a',
'b':'$fullDocument.b'}}], full_document='updateLookup') as stream:
for change in stream:
print change
将数据插入 MongoDB:
> db.test.insert({a:1, b:1, c:1, d:1})
更改流将输出:
{'a': 1.0,
'fullDocument_id': ObjectId('5aa0c2300551e941c6958f86'),
'_id': <BSON object>,
'b': 1.0}
注意:我将插入的文档投影_id
到fullDocument_id
. 您可以将其投影到_id
(例如_id: '$fullDocument._id'
),但您将丢失更改流的原始_id
字段,其中包含resume token。
注意full_document='updateLookup'
:我在创建流时也使用了该参数。否则,完整的文档将不会显示在update
事件中。这在更改事件页面中进行了解释
注意:上面的示例用于插入文档,但您可以使用$match: {operationType: 'update'}
舞台之前的$project
舞台轻松对其进行调整以进行更新。
注意:fullDocument
更新事件返回的字段包含被大多数提交给副本集成员的文档的查找版本。这可能是也可能不是被修改的文档版本。更新操作与将更改流返回到客户端之间的任何其他交错操作都可能更改了文档的版本。例如,删除事件可能导致fullDocument
字段为null
. 有关更多详细信息,请参阅查找更新操作的完整文档。