MongoDB更改流仅显示选定字段

p.d*_*man 3 watch mongodb changestream

我正在尝试了解 MongoDB 中的更改流。

我试图仅显示更新文档的某些字段。

所以我做了:

option={ 'full_document':'updateLookup' }
collection.watch([{"$match"  : { "operationType" : "update" }}] , **option)
Run Code Online (Sandbox Code Playgroud)

这是工作。

现在我只想显示一些字段。

我试过:

collection.watch([{"$match"  : { "operationType" : "update" }},{"$project":{"_id":1}}] , **option)
Run Code Online (Sandbox Code Playgroud)

或者

collection.watch([{"$match"  : { "operationType" : "update" }}],option).aggregate({"$project":{"_id":1}})
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用。

如何仅显示选定的字段?

kev*_*adi 5

更改事件文档页面,更改流将输出此文档:

{
   _id : { <BSON Object> },
   "operationType" : "<operation>",
   "fullDocument" : { <document> },
   "ns" : {
      "db" : "<database>",
      "coll" : "<collection"
   },
   "documentKey" : { "_id" : <ObjectId> },
   "updateDescription" : {
      "updatedFields" : { <document> },
      "removedFields" : [ "<field>", ... ]
   }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您在watch()方法中什么都不放,该文档将成为输出。

然后,您可以使用聚合管道阶段来过滤/修改此文档。

例如,如果您只想查看插入/更新文档中的字段_idab,管道将是(使用 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
Run Code Online (Sandbox Code Playgroud)

将数据插入 MongoDB:

> db.test.insert({a:1, b:1, c:1, d:1})
Run Code Online (Sandbox Code Playgroud)

更改流将输出:

{'a': 1.0,
 'fullDocument_id': ObjectId('5aa0c2300551e941c6958f86'),
 '_id': <BSON object>,
 'b': 1.0}
Run Code Online (Sandbox Code Playgroud)

注意:我将插入的文档投影_idfullDocument_id. 您可以将其投影到_id(例如_id: '$fullDocument._id'),但您将丢失更改流的原始_id字段,其中包含恢复令牌

注意:我full_document='updateLookup'在创建流时也使用了该参数。否则,整个文档将不会显示在update事件中。这在更改事件页面中进行了解释

注意:上面的示例用于插入文档,但您可以使用$match: {operationType: 'update'}阶段之前的$project阶段轻松定制它以进行更新。

注意fullDocument更新事件返回的字段包含多数提交给副本集成员的文档的查找版本。这可能是也可能不是被修改的文档版本。更新操作和更改流返回到客户端之间的任何其他交错操作都可能更改了文档的版本。例如,删除事件可能导致fullDocument字段为null。有关更多详细信息,请参阅查找更新操作的完整文档