Как корректно занести объект с полем 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")
  • Вопрос задан
  • 715 просмотров
Решения вопроса 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 будет значением по умолчанию, тогда монга создаст объект сама.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы