MongoDB 使用 mgo 驱动程序的管理命令

MongoDB admin commands with mgo driver

是否有可能,给定管理员权限,运行 mongo shell 命令,例如 db.stats()rs.status()db.serverStatus() 外部通过 MongoDB (mgo)?

的官方 Go 驱动程序到 mongo shell

get stats

manually running server status commands

这当然是可能的,但首先您需要记住,您列出的 "commands" 实际上是 shell 助手。您将需要通过 mgo Session.Run.

获取它们向 运行 表示的真实命令

有几种方法可以做到这一点,第一种是在 shell 中 运行 db.listCommands() 并找到合适的方法。执行此操作的第二种方法是 运行 您希望在没有括号的情况下模拟的助手。例如:

> rs.status
function () { return db._adminCommand("replSetGetStatus"); }

如您所见,帮助程序实际执行的是 运行 针对 admin 数据库的 replSetGetStatus 命令。同样,您会发现 db.stats() 实际上是 运行 的 dbstats 命令。 db.serverStatus() 助手是您列出的三个助手中唯一一个您几乎可以 运行 按原样使用的助手。

这是一个非常简单的例子,运行将这三种调用结合起来 - 我展示了两种调用形式,一种只传递一个字符串,另一种更通用的选项传递完整的命令文档 - 我 运行 这是在没有授权的测试 mongod 上进行的,因此您必须自己添加该部分以在启用授权的实例上进行测试:

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

func main() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()

    // Optional. Switch the session to a monotonic behavior.
    session.SetMode(mgo.Monotonic, true)
    result := bson.M{}
    if err := session.DB("admin").Run(bson.D{{"serverStatus", 1}}, &result); err != nil {
        panic(err)
    } else {
        fmt.Println(result)
    }
    if err := session.DB("test").Run("dbstats", &result); err != nil {
        panic(err)
    } else {
        fmt.Println(result)
    }
    if err := session.DB("admin").Run("replSetGetStatus", &result); err != nil {
        panic(err)
    } else {
        fmt.Println(result)
    }
}