带有 mgo 驱动程序的 MongoDB 管理命令

Posted

技术标签:

【中文标题】带有 mgo 驱动程序的 MongoDB 管理命令【英文标题】:MongoDB admin commands with mgo driver 【发布时间】:2015-06-15 05:58:26 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这当然是可能的,但首先您需要记住,您列出的“命令”实际上是 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)
    

【讨论】:

老兄@Adam,你太棒了。这正是我要问的,还有更多。谢谢你! 谢谢@adam。完全回答了我的问题:) else 是多余的。【参考方案2】:

get stats

manually running server status commands

【讨论】:

只有链接的答案通常不是好的答案。您应该提取回答问题所需的数据,然后获取材料。

以上是关于带有 mgo 驱动程序的 MongoDB 管理命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?

MongoDB Golang驱动mgo的连接池使用问题

用golang的mgo驱动,mongodb时区怎么设置,总是慢8小时

mgo操作mongodb

mgo 和 mongodb 的 i/o 超时

使用 mgo 将数据插入 MongoDB