MongoDB 更改流仅显示选定的字段

MongoDB change stream display only selected fields

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

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

所以我做了:

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

正在运行。

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

我试过了:

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

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

但它们都不起作用。

如何只显示选定的字段?

Change Event documentation page 开始,更改流将输出此文档:

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

也就是说,如果您在 watch() 方法中不输入任何内容,则该文档将是输出。

然后您可以使用aggregation pipeline stages来filter/modify这个文档。

例如,如果您只想查看 inserted/updated 个文档中的 _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

将数据插入 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 事件中。 Change Event page

中对此进行了解释

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

注意:更新事件返回的fullDocument字段包含副本集成员majority-committed文档的查找版本.这可能是也可能不是被修改的文档的版本。更新操作与更改流返回客户端之间的任何其他交错操作可能已经更改了文档的版本。例如,删除事件可能导致 fullDocument 字段变为 null。有关详细信息,请参阅 Lookup Full Document for Update Operations