Вопрос или проблема
У меня проблема с вставкой 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 для выявления точной причины.