node.js - Mongoose:如何从express.js应用程序中的上限集合中获取数据?

标签 node.js mongodb express mongoose capped-collections

我想监听 MongoDB 上限集合,将其用作日志记录工具。
我使用 Node、express.js、mongo(带有 mongoose)。

这是我到目前为止得到的(简化的)代码:

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/mydb');

var logSchema = new mongoose.Schema({
  date: Date,
  message: String
}, {
  capped: {
    size: 1024
  }
});
var Log = mongoose.model('Log', logSchema);

var filter = { "date": { "$gte": Date.now() } };
var stream = Log.find(filter).tailable().stream();
stream.on('data', function(doc) {
  console.log('log stream data - new doc:', doc.message);
}).on('error', function (error) {
  console.log('status stream data - error:', error.message);
}).on('close', function () {
  console.log('status stream data - closed');
});

// ...

var log = new Log();
logger = function(message) {
  log.date = new Date();
  log.message = message;
  log.save(function(err) {
    if (err) {
      return console.error('error saving log');
    }
    console.log('log message "' + message + '" added');
  });
};

// ...

myRoutingMethod = function(req, res) {
  logger('my routing method started');
  // ...
  res.json('done');
});

我的问题是,在调用 myRoutingMethod() 之前,我得到:

database connection opened
log message "my new message" added
status stream data - error: No more documents in tailed cursor
status stream data - closed

所以,我从来没有得到

log stream data - new doc: my new message

我可能遗漏了一些关于在上限 Log 集合上与 express.js 集成 stream() 的信息...

有什么线索吗?

最佳答案

很难发现有什么错误的代码。 但是,根据 StackOverflow 上的其他答案,以下内容可能会对您有所帮助:

  1. 首先,检查您环境中的 Mongoose 版本,并确保它是 2.7 或最新版本。

  2. 如果该集合处于非上限模式,并在几次迭代后添加了上限模式,请尝试删除该集合并从头开始重试。您可能需要备份集合并从备份重新初始化。

  3. 根据 StackOverflow 文档中找到的初始化,我建议按如下方式配置上限集合架构:

//new Schema declaration 
var logSchema = mongoose.Schema({...},{capped:{size: 1024, max: 1000,autoIndexId: true}});

//Export your model as following
 module.exports = mongoose.model('Log', logSchema);
  • 初始化并使用您的 Mongoose:
  • var  Log = require(path/to/log/schema);
    var query = { /** query paremeters here*/ };
    
    //Initialize the stream
    var stream = Log.find(query).tailable().stream();
    
    //Process data
    stream.on('data', function(doc){});
    stream.on('error', function(error){});
    stream.on('close', function(status){});
    
  • 要保存(或编辑)操作,您可以引用与旧方法相同的方法
  • new Log(params).save(function(error, log){
      //Do something with the error or new log
    });
    

    您还可以找到有关此 StackOverflow 答案的更多信息:https://stackoverflow.com/a/18045399/132610

    我希望这会有所帮助。

    关于node.js - Mongoose:如何从express.js应用程序中的上限集合中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067370/

    相关文章:

    android - 当日志显示没有错误时,为什么我的推送通知没有出现在设备上?

    用于流处理图像的 Node.js 库

    javascript - 如何在Vuejs中插入Echarts?

    javascript - 我的快速解析设置有什么问题?

    node.js - 防止在不需要授权时在 Redis 中创建 session

    javascript - Passport JS -> require(...) 不是函数

    javascript - 通过 CPU 交易 RAM(性能问题)

    linux - 无法连接到远程 MongoDB

    node.js - Node 未多次连接到 Mongo

    node.js - 将文档添加到文档(子文档)不起作用