观看使用MongoDB Streams创建的文档

时间:2018-12-04 17:12:08

标签: node.js mongodb mongodb-query

每次将特定类型的数据插入到集合中时,我想使用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
  • 我还需要获取fullDocument,但是很明显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);
    }
}

1 个答案:

答案 0 :(得分:2)

您需要:

  1. 指定operationType: 'insert'。由于您不想监视更新,因此不需要updateLookup
  2. 为包含operationType的过滤器创建一个合适的aggregation pipeline
  3. 聚合管道过滤watch()返回的文档。输出示例为Change Events page

watch()返回一个ChangeStream。它会触发closechangeenderror事件。有关更多详细信息,请参见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()