将集合转换为使用mgo封顶

时间:2017-10-17 15:49:19

标签: mongodb go mgo capped-collections

我想使用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)
}

1 个答案:

答案 0 :(得分:1)

1。获取收集统计信息

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

使用collStats

运行mgo
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 doc:

  

该命令具有以下语法:

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

convertToCapped获取现有集合(<collection>)并将其转换为带有最大大小(以字节为单位)的上限集合,由size参数(<capped size>)指定。

正确版本:

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]