3

我正在尝试了解 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}})

但它们都不起作用。

如何仅显示选定的字段?

4

1 回答 1

5

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

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

也就是说,如果您在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

将数据插入 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}

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

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

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

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

于 2018-03-08T05:01:34.030 回答