我正在尝试使用mongoose获取MongoDB统计信息,例如用于健康指标的数据库总大小,但未能做到这一点。
我找到了this条代码。但这似乎不起作用。
db.js:
const db = mongoose.connect(config.MONGODB_URL, settings, (err) => {
mongoose.set('useFindAndModify', false);
logger.info(`connecting ${config.MONGODB_URL}`);
if (err) {
logger.error(`failed db connection: ${err}`);
}
});
module.exports = db;
monitor.js:
const db = require('../store/db');
function mongoUsage(cb) {
db.db.stats((err, data) => {
logger.debug(data);
});
cb();
}
但是运行该函数时出现TypeError: Cannot read property 'stats' of undefined
错误。
答案 0 :(得分:1)
我认为,您必须首先确保已建立数据库连接。在提供的示例中,您可能会注意到db.once
调用正在等待open
事件发生。换句话说,我们与正在运行的数据库有一个挂起的连接,目标是在连接成功后得到通知。因此,您的连接对象仍在创建过程中,因此undefined
仍在创建中。
假设已正确定义了logger
,config
和settings
,请尝试相应地修改文件:
db.js:
const mongoose = require('mongoose');
mongoose.connect(config.MONGODB_URL, settings, (err) => {
mongoose.set('useFindAndModify', false);
logger.info(`connecting ${config.MONGODB_URL}`);
if (err) {
logger.error(`failed db connection: ${err}`);
}
});
module.exports = mongoose.connection;
monitor.js:
const db = require('../store/db');
db.once('open', () => {
// call stats directly
db.db.stats((err, data) => {
logger.debug(data);
});
// or you can call your mongoUsage here
});
使用上面的代码,我成功获得以下结果:
{ db: 'test-db',
collections: 1,
views: 0,
objects: 1,
avgObjSize: 844,
dataSize: 844,
storageSize: 36864,
numExtents: 0,
indexes: 6,
indexSize: 221184,
fsUsedSize: 2271096832,
fsTotalSize: 19163181056,
ok: 1 }
我希望它有助于解决您的问题。