Как вставить ObjectId в документ в Mongo и Golang

Вопрос или проблема

У меня проблема с вставкой ObjectId в документ.

Это модель коллекции продажи

type Sale struct {
    ID      primitive.ObjectID   `bson:"_id,omitempty"`
    Client  primitive.ObjectID   `bson:"client"`
    Items   []primitive.ObjectID `bson:"items"`
    Amounts []int                `bson:"amounts"`
    Cost    float64              `bson:"cost"`
    Payment bool                 `bson:"payment"`
    Date    time.Time            `bson:"date"`
}

Перед тем как выполнить вставку, я убедился, что Sale.Client имеет допустимое значение ObjectId, но когда я выполняю эту вставку, значение становится бинарным в таблице.

например:
ObjectId('67103588b9138d78d5ef09a2')
Binary.createFromBase64('ZxA1iLkTjXjV7wmi', 0)

Это код вставки

func CommonInsert(collection string, ctx context.Context, model interface{}) error {
    conn, err := config.GetDbConnection(ctx)
    if err != nil {
        return err
    }

    c := conn.Database("teste").Collection(collection)

    _, err = c.InsertOne(ctx, model)
    if err != nil {
        return err
    }

    return nil
}

Я сгенерировал реальные данные-заглушки для вставки, и мне все равно не удалось заставить данные быть преобразованными в ObjectId

Ответ или решение

Для корректного вставления значения ObjectId в документ MongoDB через Golang, важно понимать несколько ключевых аспектов: правильное создание и назначение значений из структуры, использование модуля mongo-go-driver, а также управление типами при вставке в коллекцию. Рассмотрим каждый из них подробно.

Шаг 1: Подготовка структуры

Обратите внимание, что структура Sale, которую вы предоставили, корректно объявлена с использованием нужных типов данных. Поля, соответствующие ObjectId, объявлены с типом primitive.ObjectID для ID клиента и массива ID товаров. Убедитесь, что значение переменной Sale.Client содержит валидный ObjectId, который можно создать с помощью метода primitive.NewObjectID() или вывести из строки с помощью primitive.ObjectIDFromHex(hexString).

Шаг 2: Ввод Mock данных

Пример создания и заполнения структуры Sale перед вставкой может выглядеть следующим образом:

package main

import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "time"
)

type Sale struct {
    ID      primitive.ObjectID   `bson:"_id,omitempty"`
    Client  primitive.ObjectID   `bson:"client"`
    Items   []primitive.ObjectID `bson:"items"`
    Amounts []int                `bson:"amounts"`
    Cost    float64              `bson:"cost"`
    Payment bool                 `bson:"payment"`
    Date    time.Time            `bson:"date"`
}

func CreateSale(clientId primitive.ObjectID, items []primitive.ObjectID, amounts []int, cost float64, payment bool) Sale {
    return Sale{
        Client:  clientId,
        Items:   items,
        Amounts: amounts,
        Cost:    cost,
        Payment: payment,
        Date:    time.Now(),
    }
}

Шаг 3: Вставка документа в коллекцию

Функция для вставки документа Sale в коллекцию должна выглядеть следующим образом:

func CommonInsert(collection string, ctx context.Context, model interface{}) error {
    conn, err := config.GetDbConnection(ctx) // Подключение к базе данных
    if err != nil {
        return err
    }

    c := conn.Database("teste").Collection(collection)

    _, err = c.InsertOne(ctx, model)
    if err != nil {
        return err
    }

    return nil
}

Шаг 4: Обработка и вставка ObjectId

Убедитесь, что перед вставкой в коллекцию документ модели правильно создан и содержит валидные значения для ObjectId. Вот пример использования:

func main() {
    ctx := context.Background()
    clientId := primitive.NewObjectID() // Или вы можете использовать ObjectIDFromHex для существующих ID
    items := []primitive.ObjectID{primitive.NewObjectID(), primitive.NewObjectID()}
    amounts := []int{1, 2}
    cost := 100.0
    payment := true

    sale := CreateSale(clientId, items, amounts, cost, payment)

    err := CommonInsert("sales", ctx, sale)
    if err != nil {
        fmt.Println("Ошибка вставки:", err)
    } else {
        fmt.Println("Документ успешно вставлен.")
    }
}

Проверка типа данных

Если в базе данных значения ObjectId продолжают сохраняться как Binary.createFromBase64, это может быть связано с неверным преобразованием типов данных перед вставкой. Убедитесь, что используете правильную библиотеку и методы для работы с MongoDB и что значения ObjectId являются именно типом primitive.ObjectID.

Заключение

Следуя указанным шагам, вы сможете корректно вставлять данные в MongoDB с использованием ObjectId в Golang без ошибок. Убедитесь в том, что типы данных в вашей модели совпадают с теми, что ожидаются в MongoDB, и что приготовленные данные действительно имеют правильные значения перед вставкой. Если проблема продолжает существовать, рассмотрите возможность проведения отладки на уровне клиента MongoDB для выявления точной причины.

Оцените материал
Добавить комментарий

Капча загружается...