MongoDB watch() 使用 NodeJS 和 Mongoose 观察数据库中的变化

The*_*Guy 5 mongoose mongodb node.js

我正在尝试观看我的 mongodb。每当发生更改时,我都想应用一个操作。这是我尝试过的

var mongoose = require('mongoose');
//mongoose.connect('mongodb://localhost/test');
mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost:27017')
mongoose.connection.createCollection('people');
const Person = mongoose.model('Person', new mongoose.Schema({ name: String }));
Person.watch().
    on('change', data => console.log(new Date(), data));
console.log(new Date(), 'Inserting doc');
Person.create({ name: 'john doe' });

console.log(new Date(), 'Inserted doc');
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误

node_modules/mongodb/lib/utils.js:132 抛出错误;^

MongoError: $changeStream 可能无法在内部管理数据库上打开

我怎样才能解决这个问题 ?

Suh*_*ayb 6

MongoDB 中的更改流需要副本集才能运行。

根据猫鼬文档:

要连接到副本集,您需要传递要连接的主机的逗号分隔列表,而不是单个主机。

mongoose.connect('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]' [, options]);
Run Code Online (Sandbox Code Playgroud)

完整示例

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

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

async function run() {
  // Make sure you're using mongoose >= 5.0.0
  console.log(new Date(), `mongoose version: ${mongoose.version}`);

  await setupReplicaSet();

  // Connect to the replica set
  const uri = 'mongodb://localhost:31000,localhost:31001,localhost:31002/' +
    'test?replicaSet=rs0';
  await mongoose.connect(uri);
  // For this example, need to explicitly create a collection, otherwise
  // you get "MongoError: cannot open $changeStream for non-existent database: test"
  await mongoose.connection.createCollection('Person');

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

  // 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');
}

// Boilerplate to start a new replica set. You can skip this if you already
// have a replica set running locally or in MongoDB Atlas.
async function setupReplicaSet() {
  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...');
}
Run Code Online (Sandbox Code Playgroud)

完整示例摘自 https://thecodebarbarian.com/stock-price-notifications-with-mongoose-and-mongodb-change-streams


Dan*_*inn 1

您可以\xe2\x80\x99t,更改流游标在系统集合或管理、本地和配置数据库中的任何集合上不可用。您可以尝试将数据库结构配置为不是管理数据库。

\n\n

Mongodb 变更流文档

\n