在具有管理员凭证的情况下,是否可以通过 MongoDB 的官方 Go 驱动程序(mgo)以外的方式运行mongo shell命令,例如db.stats()
、rs.status()
和db.serverStatus()
?
这当然是可能的,但首先您需要记住,您列出的“命令”实际上是shell助手。您需要获取它们代表的真正命令才能通过mgo
Session.Run运行它们。
有几种方法可以做到这一点,第一种方法是在shell中运行db.listCommands()
并找到适当的命令。第二种方法是不使用括号运行您希望模仿的助手。例如:
> rs.status
function () { return db._adminCommand("replSetGetStatus"); }
正如你所看到的,帮助程序实际上运行replSetGetStatus
命令来查询admin
数据库。同样,你会发现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)
}
}