Mongodb уведомляет о обновленном документе

Представьте, что если у меня был mongodb с некоторыми документами и nodejs-сервер, который выдает json-данные из mongodb клиенту, используя socket.io, и некоторый процесс обновил этот файл mongodb, который в настоящее время находится в представлении клиента, мне было интересно если есть способ, чтобы mongodb уведомлял сервер nodejs, когда объект обновляется кем-либо, кроме самого клиента, так что я могу исправить обновленный документ json через открытый сокет, возможно ли это?

Я пытался найти некоторые ресурсы в Google без везения.

Ответ 1

Скажите, что это схема документа

'use strict';

import mongoose from 'mongoose';

var MessageSchema = new mongoose.Schema({
  toid: String,
  fromid: String,
  toname: String,
  fromname: String,
  content: String,
  date: { type: Date, default: Date.now }
});

export default mongoose.model('Message', MessageSchema);

И вот код базы данных, где вы меняете содержимое документа

import {Router} from 'express';
var router = new Router();
router.post('/create/:id', function(req, res){
return Message.create(req.body)
    .then(respondWithResultAndEmitAnEvent(res, 201))
    .catch(handleError(res));
}); 

Итак, эта функция replyWithResultAndEmitAnEvent выглядит примерно так: так как название подсказывает, где даже пользователь POST передает данные на сервер (скажем, на url xyz.com/api/create/:id), сервер выдаст событие, которое может быть захвачено другими клиентами.

function respondWithResultAndEmitAnEvent(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      socket.emit('message_added', entity);
      res.status(statusCode).json(entity);
    }
  };
}

На стороне клиента вы можете прослушать это событие "message_added" и обновить его.

    socket.on('message_added', function ( data ) {
      console.log(data);
      //update the client with new data;
    }); 

Ответ 2

Если у вас есть контроль над другим процессом, я бы рекомендовал сделать это проактивно, что означает, что процесс сохранения - это то, что запускает код, который "наблюдает" за изменениями. В противном случае вы можете выполнять интервальный опрос, но это обычно неэффективно и, как правило, плохой дизайн. Вы также можете изучить некоторые из наиболее интересных методов, например, наблюдать за Mongo Oplog.

Ответ 3

У Mongoose есть middlawre: http://mongoosejs.com/docs/middleware.html

Вы можете запустить script для сохранения и удаления записей. в этом script вы можете делать все, включая уведомление о вашем сервере уведомлений.