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

7

在具有管理员凭证的情况下,是否可以通过 MongoDB 的官方 Go 驱动程序(mgo)以外的方式运行mongo shell命令,例如db.stats()rs.status()db.serverStatus()?

2个回答

15

这当然是可能的,但首先您需要记住,您列出的“命令”实际上是shell助手。您需要获取它们代表的真正命令才能通过mgoSession.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)
    }
}

1
老兄 @Adam,你太棒了。这正是我所问的,而且更多。谢谢你! - kylemclaren
1
谢谢@adam。完全回答了我的问题 :) - Janaka
else是多余的。 - Sergey11g

-3

4
仅回答链接通常不是好的回答。您应该提取回答问题所需的数据,然后引用资料来源。 - ddavison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接