【问题标题】:Convert Collection to Capped with mgo使用 mgo 将集合转换为上限
【发布时间】:2017-10-17 15:49:18
【问题描述】:

我想使用 gopkg.in/mgo.v2 将 mongo 集合转换为上限。

我可以从头开始创建一个有上限的集合 - 如下:

# Create a Capped Collection
sess.DB("").C("my_collection").Create(&mgo.CollectionInfo{Capped: true, MaxBytes: tenMB, MaxDocs: 10})

我不知道如何获取现有集合的统计信息或如何运行convertToCapped 命令。

第 1 步 - 获取收藏统计信息:

# Mongo
db.getCollection('my_collection').stats();

# mgo // I need to find out how to do this.

第 2 步 - 转换为上限

# Mongo
db.runCommand({"convertToCapped": "my_collection", size: 1000000});

# mgo // I need to find out how to do this.
if err := sess.DB("").Run(bson.D{{"convertToCapped", "my_collection"}, {"size", "1000"}}, nil); err != nil {
        println(err.Error()) // invalid command spec
        os.Exit(1)
}

【问题讨论】:

    标签: mongodb go mgo capped-collections


    【解决方案1】:

    1。获取收藏统计信息

    这不是 mgo 包的一部分,但它可以作为可运行的 MongoDB 命令使用:collStats

    运行collStatsmgo

    var doc bson.M
    err := mgr.sess.DB("").Run(bson.D{
        {Name: "collStats", Value: "my_collection"},
    }, &doc)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Println("Result:", doc)
    fmt.Println("Capped:", doc["capped"])
    // Acquire capped info as a bool value:
    capped, ok := doc["capped"].(bool)
    if ok {
        fmt.Println("Capped bool value:", capped)
    }
    

    示例输出(veeeeeeery 长这么大块):

    Result: map[ok:1 size:36 storageSize:4096 totalIndexSize:4096  ...chunked...]
    Capped: true
    Capped bool value: true
    

    2。转换为上限

    您尝试的简单问题是"size" 参数的值必须是数字而不是string。引用convertToCapped 文档:

    该命令的语法如下:

      { convertToCapped: <collection>, size: <capped size> }
    

    convertToCapped 采用现有集合 (&lt;collection&gt;) 并将其转换为具有最大大小(以字节为单位)的上限集合,由 size 参数 (&lt;capped size&gt;) 指定。

    正确版本:

    var doc bson.M
    err := mgr.sess.DB("").Run(bson.D{
        {Name: "convertToCapped", Value: "my_collection"},
        {Name: "size", Value: 1<<20}, // 1 MB
    }, &doc)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Println("Result:", doc)
    

    示例输出:

    Result: map[ok:1]
    

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 2019-07-23
      • 2020-01-19
      • 2023-02-07
      • 2010-10-15
      • 2013-09-19
      • 1970-01-01
      • 2014-11-02
      • 2013-12-16
      相关资源
      最近更新 更多