6

I'm trying to get results of db.stats() mongo shell command in my python code (for monitoring purposes).

But unlike for example serverStatus I can't do db.command('stats'). I was not able to find any API equivalent in mongodb docs. I've also tried variations with db.$cmd but none of that worked.

So,

Small question: how can I get results of db.stats() (number of connections/objects, size of data & indexes, etc) in my python code?

Bigger question: can anyone explain why some of shell commands are easily accessible from API, while others are not? It's very annoying: some admin-related tools are accessible via db.$cmd.sys, some via db.command, some via ...? Is there some standard or explanation of this situation?

PS: mongodb 2.0.2, pymongo 2.1.0, python 2.7

1 Answer 1

12

The Javascript shell's stats command helper actually invokes a command named dbstats, which you can run from PyMongo using the Database.command method. The easiest way to find out what command a shell helper will run is to invoke the shell helper without parentheses -- this will print out the Javascript code it runs:

> db.stats
function (scale) {
    return this.runCommand({dbstats:1, scale:scale});
}

As for why some commands have helpers and others do not, it's largely a question of preference, time, and perceived frequency of use by the driver authors. You can run any command by name with Database.command, which is just a convenience wrapper around db.$cmd.find_one. You can find a full list of commands at List of Database Commands. You can also submit a patch against PyMongo to add a helper method for commands you find that you need to invoke frequently but aren't supported by PyMongo yet.

Sign up to request clarification or add additional context in comments.

2 Comments

Be warned that dbstats blocks your database while it runs, so it's not suitable in production. jira.mongodb.org/browse/SERVER-5714
It's not clear this is still a blocking call in the WiredTiger storage engine: stackoverflow.com/questions/36559408/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.