每次将特定类型的数据插入到集合中时,我想使用MongoDB流来触发事件。
我已经找到了与我要寻找的东西大致相似的东西,但这仅适用于变更流而不是插入。
关于如何完成此任务的任何想法吗?
我正在将 Mongodb 驱动程序与 Nodejs 一起使用,因此我的代码将是这样的:
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: {
$or: [
{ $or: [{"receipt.receiver": "newdexpocket"}, {"act.account": "newdexpocket"}] }]
}
}];
var options = { fullDocument: 'updateLookup' };
db.collection('somecollection').watch(filter, options).on('create', data =>
{
console.log(data);
});
});
operationType
?updateLookup
不是正确的工具,我应该使用什么?on
事件中可以使用哪些选项?我用过create
,但我甚至不确定它是否存在,是吗?很抱歉,所有这些问题,但我正在努力在官方文档中找到一些答案。
解决方案:
请注意不要忘记您的请求中的fullDocument
;-)
function watch_insert(con, db, coll) {
console.log(new Date() + ' watching: ' + coll);
const insert_pipeline = [ { $match:
{
operationType: 'insert',
$or: [
{ "fullDocument.receipt.receiver": "newdexpocket" },
{ "fullDocument.act.account": "newdexpocket" }
]
}
}];
con.db(db).collection(coll).watch(insert_pipeline)
.on('change', data => {
console.log(data)
});
}
async function run(uri) {
try {
con = await MongoClient.connect(uri, {"useNewUrlParser": true});
watch_insert(con, 'EOS', 'action_traces');
} catch (err) {
console.log(err);
}
}
答案 0 :(得分:2)
您需要:
operationType: 'insert'
。由于您不想监视更新,因此不需要updateLookup
。operationType
的过滤器创建一个合适的aggregation pipeline。watch()
返回的文档。输出示例为Change Events page。 watch()
返回一个ChangeStream
。它会触发close
,change
,end
和error
事件。有关更多详细信息,请参见ChangeStream。
这是一个变更流的完整示例,它侦听数据库insert
集合test
上的test
操作。它将输出具有字段{a: 1}
('fullDocument.a': 1
)的文档,并且将忽略更新,插入其他a
值或不包含字段a
的任何内容。
const MongoClient = require('mongodb').MongoClient
const uri = 'mongodb://localhost:27017/test?replicaSet=replset'
const insert_pipeline = [
{$match: {operationType: 'insert', 'fullDocument.a': 1}}
]
function watch_insert(con, db, coll) {
console.log(new Date() + ' watching: ' + coll)
con.db(db).collection(coll).watch(insert_pipeline)
.on('change', data => {
console.log(data)
})
}
async function run() {
con = await MongoClient.connect(uri, {"useNewUrlParser": true})
watch_insert(con, 'test', 'test')
}
run()