MongoDB更改流仅显示选定字段

标签 mongodb watch changestream

我正在尝试了解 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过滤/修改此文档。

例如,如果您只想查看字段 _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 中。事件。这在 Change Event page 中有解释

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

备注 : fullDocument更新事件返回的字段包含多数提交给副本集成员的文档的查找版本。这可能是也可能不是被修改的文档版本。更新操作和更改流返回到客户端之间的任何其他交错操作都可能更改了文档的版本。例如,删除事件可能会导致 fullDocument字段为 null .见 Lookup Full Document for Update Operations更多细节。

关于MongoDB更改流仅显示选定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49153312/

相关文章:

javascript - NodeJS promise (Q) .然后它不会被调用

javascript - 仅返回嵌入文档列表中的部分字段

javascript - Angular 观察组未能始终如一地接收模型变化

vue.js - 如何正确使用 Vue Router beforeRouteEnter 或 Watch 来触发单文件组件中的方法?

database - 删除文档后如何从MongoDB changeStream获取fullDocument?

node.js - 我如何实现将数据从mongodb流传输到elasticsearch的 Node JS worker?

node.js - Mongodb更改流运行多次(有点): Node app running multiple instances

mongodb - 无法使用 SSL 将 Apache Spark 连接到 MongoDB

angularjs - 在遇到 karma 暂停后,如何让 grunt watch 继续?

node.js - Express 在 Jade 中显示 mongodb 文档