【问题标题】:Mongodb notify on document updatedMongoDB 通知文档更新
【发布时间】:2014-02-05 19:24:47
【问题描述】:

想象一下,如果我有一个带有一些文档的 mongodb 和一个 nodejs 服务器,它使用 socket.io 从 mongodb 向客户端发送 json 数据,并且某个进程已经更新了当前在客户端视图中的那个 mongodb 文档,我想知道如果有办法让 mongodb 在对象被客户端本人以外的任何人更新时通知 nodejs 服务器,以便我可以通过打开的套接字发出更新的文档 json,这可能吗?

我试图在谷歌上找到一些资源,但没有成功。

【问题讨论】:

  • 您是否可以控制更新 MongoDB 的进程?
  • @jibsales 是的,但它是不同的服务器,我知道如何手动操作,但我想知道内置的东西是否有帮助
  • 没有对钩子、触发器、侦听器等的原生支持,但请查看以下 SO 帖子(点赞最多的帖子,而不是接受的答案):stackoverflow.com/questions/9691316/…
  • 哦,您可能还对伟大的 TJ Hallowaychuck 的 watch(1) 感兴趣,以查看 oplog 的变化 - github.com/visionmedia/watch
  • 感谢 Kanka 和 @jibsales 的建议,你们能用这些信息发布答案以帮助其他人找到这些解决方案吗?点赞等待 =)

标签: node.js mongodb express websocket socket.io


【解决方案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

    您可以对保存和删除的记录运行脚本。在此脚本中,您可以执行任何操作,包括通知您的通知服务器。

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 2016-04-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2016-08-04
      相关资源
      最近更新 更多