Создание уникальных индексов с драйвером по умолчанию MongoDb в Go - PullRequest
1 голос
/ 29 февраля 2020

У меня проблемы с созданием уникальных индексов для некоторых моих данных с использованием официального драйвера MongoDB для Go.

Итак, у меня есть такая структура:

type Product struct {
    ID        primitive.ObjectID `json:"_id" bson:"_id"`
    Name      string             `json:"name" bson:"name"`
    Price     float64            `json:"price" bson:"price"`
    Attribute []Attribute        `json:"attribute" bson:"attribute"`
    Category  string             `json:"category" bson:"category"`
}

А потом я хочу создать уникальный индекс для свойства name. Я пытался сделать что-то подобное в моей функции Create (для продуктов)

func Create(c echo.Context) error {

    //unique index here 
    indexModel, err := productCollection.Indexes().CreateOne(context.Background(),
        IndexModel{
            Keys:    bsonx.Doc{{"name", bsonx.Int32(1)}},
            Options: options.Index().SetUnique(true),
        })
    if err != nil {
        log.Fatalf("something went wrong: %+v", err)
    }

    //create the product here
    p := new(Product)
    if err := c.Bind(p); err != nil {
        log.Fatalf("Could not bind request to struct: %+v", err)
        return util.SendError(c, "500", "something went wrong", "failed")
    }
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    result, _ := productCollection.InsertOne(ctx, p)

    return util.SendSuccess(c, result.InsertedID)

}

Проблема в том, что я не знаю точно, как передать indexModel в качестве параметра в контексте перед созданием товар. Кроме того, я не уверен, что с тем, что я делаю, я создаю индекс только один раз (что я хочу сделать) . Я был бы признателен, если бы мне указали в правильном направлении, как это сделать.

Я использую инфраструктуру echo для Go, на всякий случай, если это предоставляет больше контекста.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

да, я как бы смотрю на это в том смысле, что создание индекса - это одноразовое событие DBA / Admin. Это не задача приложения / кода. Войдите в mon go с соответствующим разрешением, создайте индекс, выйдите ... нет кода, кроме команды оболочки mon go для создания индекса.

0 голосов
/ 01 марта 2020

Ваш код будет пытаться создать индекс каждый раз, когда вызывается функция Create, которая будет работать, но не очень эффективно, поскольку индекс нужно создать только один раз (или, если он не существует). Я бы рекомендовал разрешить создание вашего индекса за функцию, которая устанавливает соединение с БД, или за функцию, запускаемую сразу после инициализации соединения с БД, так что он запускается только один раз (при запуске вашей программы).

Поскольку метод collection.Indexes().CreateOne(...) не возвращает ошибку при попытке создать уже существующий индекс, вы можете использовать его как способ убедиться, что индекс существует, подобно тому, как неофициальный драйвер MongoDB имел EnsureIndex function.

Кроме того, вы можете сделать то, что Cahaba Data предлагает в его ответе , что сделать создание индекса единовременной задачей администратора БД вместо ответственность вашего приложения. Ранее я обсуждал это с некоторыми коллегами, и, хотя я согласен с тем, что это технически одноразовая задача администратора БД, я все же предпочитаю, чтобы мое приложение при запуске проверяло, что нужные ему индексы действительно присутствуют, создавая их, если они не. В конце концов, мое приложение может работать неправильно, если кто-то забудет или создаст неправильные индексы. Он также предоставляет хорошую документацию по тем показателям, в которых нуждается / использует ваше приложение, вместо того, чтобы сообщать об этом администратору БД и надеяться, что он / она / она примет это к сведению. Не стесняйтесь формировать собственное мнение, конечно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...