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

kyl*_*ren 6 go mongodb mgo

是否有可能,因为管理员creds,运行蒙戈shell命令,例如db.stats(),rs.status()和db.serverStatus()外部通过官方转到司机蒙戈外壳MongoDB的氧化镁(MgO)?

Ada*_*ord 14

这当然是可能的,但首先你需要记住,你列出的"命令"实际上是shell助手.您需要获取它们所代表的真实命令才能通过mgo Session.Run运行它们.

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

> rs.status
function () { return db._adminCommand("replSetGetStatus"); }
Run Code Online (Sandbox Code Playgroud)

如您所见,帮助程序实际执行的操作是replSetGetStatus对admin数据库运行命令.同样,您会发现db.stats()实际运行该dbstats命令.该db.serverStatus()助手是你上市,你几乎可以运行的,是三个唯一的一个.

这是一个运行所有三个的一个非常简单的例子 - 我展示了两种形式的调用,一个只传递一个字符串,一个更通用的选项传递给完整的命令文档 - 我在mongod没有auth 的测试中运行它,所以你会有自己添加该部分以在启用auth的实例上进行测试:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)