我正在使用mongodb的节点驱动程序在包含大量不断更新的字段的文档上启动更改流(通过插入/更新端的某些逻辑,只调用 $ set 已更改的字段),但我想只关注特定字段的更改。我目前的尝试是在下面,但即使该字段不是更新的一部分,我只是得到每次更新。
我认为“updateDescription.updatedFields”就是我所追求的,但到目前为止我的代码只是给了我所有的更新。
正确的$ match过滤器看起来像是什么样的?我想也许可以检查它是否是$ gte:1可能是一个hack来让它工作,但我仍然只是得到每一个更新。我已经尝试过$ 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);
});
});
答案 0 :(得分:1)
所以我想出来了......
对于其他感兴趣的人:我的“管道”(在我的示例中为过滤器)需要是一个数组
这有效......
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);
});
});
答案 1 :(得分:0)
我正在寻找类似的内容,但是在https://www.mongodb.com/blog/post/an-introduction-to-change-streams的博客文章中,您可能需要将过滤器更改为:
var filter = {
$match: {
$and: [
{ "updateDescription.updatedFields.SomeFieldA": { $exists: true } },
{ operationType: 'update'}
]
}
};