如何使用mongoose获取MongoDB数据库统计信息?

时间:2019-05-16 22:35:56

标签: node.js mongodb mongoose

我正在尝试使用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错误。

1 个答案:

答案 0 :(得分:1)

我认为,您必须首先确保已建立数据库连接。在提供的示例中,您可能会注意到db.once调用正在等待open事件发生。换句话说,我们与正在运行的数据库有一个挂起的连接,目标是在连接成功后得到通知。因此,您的连接对象仍在创建过程中,因此undefined仍在创建中。

假设已正确定义了loggerconfigsettings,请尝试相应地修改文件:

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 }

我希望它有助于解决您的问题。