如何监视 MongoDB 更改流中特定字段的更改

Zac*_*ane 12 mongodb node.js aggregation-framework

我正在使用 mongodb 的节点驱动程序在具有许多连续更新的字段的文档上启动更改流(通过插入/更新端的某些逻辑调用$set仅包含更改的字段),但我想仅监视特定字段的更改。我目前对此的尝试如下,但即使该字段不是更新的一部分,我也只会获得每次更新。

我认为“updateDescription.updatedFields”是我所追求的,但到目前为止我拥有的代码只是给了我所有的更新。

正确的 $match 过滤器会是什么样子来实现这样的目标?我想也许检查它是否是 $gte:1 可能是让它工作的黑客,但我仍然只是得到每个更新。我试过 $inc 来查看字段名称是否也在“updatedFields”中,但这似乎也不起作用。

const MongoClient = require('mongodb').MongoClient;

const uri = 'mongodb://localhost:27017/?replicaSet=rs0';
MongoClient.connect(uri, function(err, client) {

    const db = client.db('mydb');
    // Connect using MongoClient
    var filter = {
        $match: {
            "updateDescription.updatedFields.SomeFieldA": { $gte : 1 },
            operationType: 'update'
        }
    };

    var options = { fullDocument: 'updateLookup' };
    db.collection('somecollection').watch(filter, options).on('change', data => {
        console.log(new Date(), data);
    });
});
Run Code Online (Sandbox Code Playgroud)

Zac*_*ane 7

所以我想出了这个...

对于其他感兴趣的人:我的“管道”(过滤器,在我的例子中)需要是一个数组

这有效...

const MongoClient = require('mongodb').MongoClient;

const uri = 'mongodb://localhost:27017/?replicaSet=rs0';
MongoClient.connect(uri, function(err, client) {

    const db = client.db('mydb');
    // Connect using MongoClient
    var filter = [{
        $match: {
            $and: [
                { "updateDescription.updatedFields.SomeFieldA": { $exists: true } },
                { operationType: "update" }]
        }
    }];

    var options = { fullDocument: 'updateLookup' };
    db.collection('somecollection').watch(filter, options).on('change', data => 
    {
        console.log(new Date(), data);
    });
});
Run Code Online (Sandbox Code Playgroud)