Mongoose:如何从 express.js 应用程序中的上限集合中获取数据?
Mongoose: how to get data from a capped collection in an express.js app?
我想收听 MongoDB 上限集合,将其用作日志记录工具。
我使用节点,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
我可能遗漏了一些关于 stream()
在上限 Log
集合上与 express.js
...
的整合
有线索吗?
很难发现哪里出了问题的代码。
但是,根据 Whosebug 上的其他答案,以下内容可能会对您有所帮助:
首先,检查您环境中 Mongoose
的版本,确保它是 2.7
或最新版本。
如果您的集合处于非上限模式并在几次迭代后添加了上限模式,请尝试删除该集合并从头开始重试。您可能需要备份集合并从备份中重新初始化。
基于在 Whosebug 上的文档中找到的初始化,我建议按如下方式配置上限集合架构:
//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
});
您还可以找到有关此 Whosebug 答案的更多信息:
希望对您有所帮助。
我想收听 MongoDB 上限集合,将其用作日志记录工具。
我使用节点,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
我可能遗漏了一些关于 stream()
在上限 Log
集合上与 express.js
...
有线索吗?
很难发现哪里出了问题的代码。 但是,根据 Whosebug 上的其他答案,以下内容可能会对您有所帮助:
首先,检查您环境中
Mongoose
的版本,确保它是2.7
或最新版本。如果您的集合处于非上限模式并在几次迭代后添加了上限模式,请尝试删除该集合并从头开始重试。您可能需要备份集合并从备份中重新初始化。
基于在 Whosebug 上的文档中找到的初始化,我建议按如下方式配置上限集合架构:
//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
});
您还可以找到有关此 Whosebug 答案的更多信息:
希望对您有所帮助。