MongoDB 通知文档更新
Posted
技术标签:
【中文标题】MongoDB 通知文档更新【英文标题】:Mongodb notify on document updated 【发布时间】:2014-02-05 19:24:47 【问题描述】:想象一下,如果我有一个带有一些文档的 mongodb 和一个 nodejs 服务器,它使用 socket.io 从 mongodb 向客户端发送 json 数据,并且某个进程已经更新了当前在客户端视图中的那个 mongodb 文档,我想知道如果有办法让 mongodb 在对象被客户端本人以外的任何人更新时通知 nodejs 服务器,以便我可以通过打开的套接字发出更新的文档 json,这可能吗?
我试图在谷歌上找到一些资源,但没有成功。
【问题讨论】:
您是否可以控制更新 MongoDB 的进程? @jibsales 是的,但它是不同的服务器,我知道如何手动操作,但我想知道内置的东西是否有帮助 没有对钩子、触发器、侦听器等的原生支持,但请查看以下 SO 帖子(点赞最多的帖子,而不是接受的答案):***.com/questions/9691316/… 哦,您可能还对伟大的 TJ Hallowaychuck 的watch(1)
感兴趣,以查看 oplog 的变化 - github.com/visionmedia/watch
感谢 Kanka 和 @jibsales 的建议,你们能用这些信息发布答案以帮助其他人找到这些解决方案吗?点赞等待 =)
【参考方案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));
);
所以这个 respondWithResultAndEmitAnEvent 函数看起来像这样, 顾名思义,即使用户将数据发布到服务器(例如在 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。
【讨论】:
oplog 只会显示查询,但实际上不会显示受影响的文档。【参考方案3】:猫鼬有一个中间人:http://mongoosejs.com/docs/middleware.html
您可以对保存和删除的记录运行脚本。在此脚本中,您可以执行任何操作,包括通知您的通知服务器。
【讨论】:
以上是关于MongoDB 通知文档更新的主要内容,如果未能解决你的问题,请参考以下文章