【问题标题】:How to filter mongoose changeStream如何过滤猫鼬changeStream
【发布时间】:2019-12-29 10:32:31
【问题描述】:

我正在做一个聊天系统,我尝试使用mongoDB/mongoose的changeStream。

如果当前用户是收件人,我只想获取文档,但它不起作用。到目前为止,我遇到了两个案例。一个从不触发,另一个与所有文档一起返回,即使当前用户不是收件人。

区别在于数组中的管道与否。

你知道什么是正确的语法吗?


我阅读了过去 2 天在谷歌前 10 页找到的所有文章,但没有一篇包含如何过滤。据我了解,聚合管道仅用于操作结果,但无法排除未通过条件的文档。


这是我所做的:

const pipeline = [{
     $match: { 
         "userId": this.recipient.id,
         "recipientId": this.user.id
    }
}]

const stream = MessageModel.watch(pipeline )

stream.on('change', (data: any) => {
    console.log(`messages changed`);
    this.socketIo.sockets.in(this.socket.id).emit(`protected/message/subscribe/${this.msg.msgId}`, data.fullDocument);
});

【问题讨论】:

  • 我觉得这篇文章对你很有帮助thecodebarbarian.com/…
  • 我阅读了过去 2 天在谷歌前 10 页找到的所有文章(包括这篇文章),但没有一篇包含如何过滤。据我了解,聚合管道仅用于操作结果,但无法排除未通过条件的文档。
  • 如果你找到了,请在这里分享答案,我想这对我来说将在未来几天内成为现实

标签: node.js mongodb mongoose


【解决方案1】:

这可能有用

const { ReplSet } = require('mongodb-topology-manager');
const mongoose = require('mongoose');

run().catch(error => console.error(error));

async function run() {
  console.log(new Date(), 'start');
  const bind_ip = 'localhost';
  // Starts a 3-node replica set on ports 31000, 31001, 31002, replica set
  // name is "rs0".
  const replSet = new ReplSet('mongod', [
    { options: { port: 31000, dbpath: `${__dirname}/data/db/31000`, bind_ip } },
    { options: { port: 31001, dbpath: `${__dirname}/data/db/31001`, bind_ip } },
    { options: { port: 31002, dbpath: `${__dirname}/data/db/31002`, bind_ip } }
  ], { replSet: 'rs0' });

  // Initialize the replica set
  await replSet.purge();
  await replSet.start();
  console.log(new Date(), 'Replica set started...');

  // Connect to the replica set
  const uri = 'mongodb://localhost:31000,localhost:31001,localhost:31002/' +
    'test?replicaSet=rs0';
  await mongoose.connect(uri);

  // To work around "MongoError: cannot open $changeStream for non-existent
  // database: test" for this example
  await mongoose.connection.createCollection('people');

  const Person = mongoose.model('Person', new mongoose.Schema({ name: String }));

  // Create a change stream. The 'change' event gets emitted when there's a
  // change in the database
  Person.watch().
    on('change', data => console.log(new Date(), data));

  // Insert a doc, will trigger the change stream handler above
  console.log(new Date(), 'Inserting doc');
  await Person.create({ name: 'Axl Rose' });
  console.log(new Date(), 'Inserted doc');
}

【讨论】:

  • 我使用副本集。在这段代码 sn-p 中 watch 方法是空的,但我认为它的参数是 / 是关键,如果这里有任何关键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2020-04-12
  • 2021-01-18
  • 2023-04-01
  • 2017-01-06
相关资源
最近更新 更多