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 通知文档更新的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB——文档操作(更新文档)

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?

03 MongoDB文档的各种增加更新删除操作总结

MongoDB 更新文档

03 MongoDB文档的各种增加更新删除操作总结

更新嵌套的 MongoDB 文档对象