2014-01-16 3 views
11

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

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

+0

У вас есть контроль над процессом обновления MongoDB? – srquinn

+0

@jibsales yes, но это другой сервер, и я знаю, как делать что-то вручную, но мне было интересно, может ли встроенная в него возможность помочь. – Kanka

+0

Нет встроенной поддержки для перехватчиков, триггеров, прослушивателей и т. Д., Но проверьте следующее сообщение SO (тот, самый высокий процент, а не принятый ответ): http://stackoverflow.com/questions/9691316/how-to-listen-for-changes-to-a-mongodb-collection – srquinn

ответ

0

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

+0

В oplog будут отображаться только запросы, но на самом деле не отображаются затронутые документы. –

2

Say это документ схемы

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

Так что respondWithResultAndEmitAnEvent функция взгляд что-то вроде этого, поскольку название предполагает, что даже пользователь 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; 
    }); 
0

Mongoose имеет middlawre: http://mongoosejs.com/docs/middleware.html

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

Смежные вопросы