【发布时间】:2015-06-15 05:58:26
【问题描述】:
如果有管理员凭据,是否可以通过 MongoDB 的官方 Go 驱动程序 (mgo) 在 mongo shell 外部运行 mongo shell 命令,例如 db.stats()、rs.status() 和 db.serverStatus()?
【问题讨论】:
如果有管理员凭据,是否可以通过 MongoDB 的官方 Go 驱动程序 (mgo) 在 mongo shell 外部运行 mongo shell 命令,例如 db.stats()、rs.status() 和 db.serverStatus()?
【问题讨论】:
这当然是可能的,但首先您需要记住,您列出的“命令”实际上是 shell 助手。您需要通过mgo Session.Run 获取它们所代表的真实命令才能运行它们。
有几种方法可以做到这一点,第一种是在 shell 中运行 db.listCommands() 并找到合适的。第二种方法是运行您希望在不带括号的情况下模拟的助手。例如:
> rs.status
function () { return db._adminCommand("replSetGetStatus"); }
如您所见,帮助程序实际所做的是针对admin 数据库运行replSetGetStatus 命令。同样,您会发现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)
}
}
【讨论】:
【讨论】: