Как корректно занести объект с полем ObjectID в MongoDB (Golang mongo-driver)?

Есть структура с полем primitive.ObjectID, которое должно присваиваться самой СУБД.
type Indicator struct {
	Id          primitive.ObjectID `bson:"_id"`
	Name        string
	Ticker      string
	Options     map[string]interface{}
	Subscribers []string
}

То есть, при создании структуры, я заполняю все поля кроме ID. Далее, с помощью collection.InsertOne() добавляю структуру в базу, где ей присваивается пустой "_id". Соответственно InsertedID, возвращаемый InserOne() тоже пустой.

Как сделать так, чтобы Mongo самостоятельно присваивала корректный ObjectID документу?

Тестовый код:

testIndicator := db.Indicator{
		Name:   "testLevel",
		Ticker: "AAPL",
		Options: map[string]interface{}{
			"price":       238.0,
			"update_rate": "30min",
		},
		Subscribers: []string{"testsub1", "testsub2"},
	}

	res, err := indicatorCollection.InsertOne(ctx, testIndicator)
	if err != nil {
		t.Error(err)
	}
	fmt.Println(res.InsertedID) // выводит: ObjectID("000000000000000000000000")
  • Вопрос задан
  • 826 просмотров
Решения вопроса 1
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Все правильно, вы при отправке посылаете такой _id, потому что у вас в структуре это значение идет по умолчанию.

Есть несколько вариантов решения вопроса:
1) Использовать разные структуры для получения и отправки, где в структуре для вставки не будет поля _id, тогда монга сама задаст значение для id.
2) Либо генерировать id на клиенте через primitive.NewObjectID()
в вашем случае:
testIndicator := db.Indicator{
    ID: primitive.NewObjectID(),
    ...
  }

3) Использовать *primitive.ObjectID в качестве типа для ID, nil будет значением по умолчанию, тогда монга создаст объект сама.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы