Конвертировать коллекцию в увенчанный MGO

Я хотел бы преобразовать коллекцию монго в верхнюю часть, используя gopkg.in/mgo.v2,

Я могу создать ограниченную коллекцию с нуля - следующим образом:

# 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 ответ

Решение

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)
}

Пример вывода (веееееее, долго так ломается):

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 берет существующую коллекцию (<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]
Другие вопросы по тегам