Pull to refresh

Comments 12

Писал, недавно свой такой, getOne мне кажется в моем случае более оптимизированный

type Record struct {
	Hello string `bson:"hello"`
}

record := new(Record)

err = mgoConnector.GetOne(TEST_COLLECTION, bson.M{
    "hello": "test",
}, record)

fmt.Println((*record).Hello)


Если интересно могу выложить в opensource, правда операций поменьше:

type MongoConnector struct {
	Connect        func(mongoUrl string, databaseName *string) error
	InsertOne      func(collectionName string, entity interface{}) error
	UpdateOne      func(collectionName string, findPredicate bson.M, updatePredicate bson.M) error
	UpdateAll      func(collectionName string, findPredicate bson.M, updatePredicate bson.M) (*mgo.ChangeInfo, error)
	GetOne         func(collectionName string, findPredicate bson.M, structToDeserialize interface{}) error
	GetAll         func(collectionName string, findPredicate bson.M, structToDeserialize interface{}) error
	DropCollection func(collectionName string) error
	Disconnect     func()
}

А GetAll у вас сразу декодирует результат в массив или приходится перебирать Cursor?
mgo декодирует сразу в массив и такой вариант лично мне нравится больше. Пока я не осознал пользы Cursor.
Не перебирать не надо(серилизация в массив сразу), под капотом да, идет перебор, профит чисто если большой размер получаемый данных, грубо говоря при переборе с помощью итератора будет нагрузка меньше.
Может стоит отправить это в open source и написать здесь мануал?
Хм, как, однако, много изменилось с альфы. Буквально пару месяцев назад(0.0.17) работа с bson вообще по-другому выглядела — использовалось куча
бойлерплейтных билдеров
.UpdateOne(nil,
		bson.NewDocument(bson.EC.String("_id", access.UserID)),
		bson.NewDocument(
			bson.EC.SubDocumentFromElements("$addToSet",
				bson.EC.SubDocumentFromElements("documents",
					bson.EC.Array("$each", documents),
				),
			),
			bson.EC.SubDocumentFromElements("$setOnInsert",
				bson.EC.String("_id", access.UserID),
			),
		),
		updateopt.Upsert(true),
)


Рад, что все стало намного аккуратнее. Из хотелок — не появилось ли возможности оборачивать кастомные структуры в bson.D? Например, что бы можно было писать что-то наподобие

partialUpdate := MyCustomStruct { Note: "New Note" }
update:= bson.D { {"$set" , &partialUpdate}} 
filter := MyCustomStruct{ ID: "some-id" }
collection.UpdateOne(context.TODO(), filter, update)


Не понимаю зачем все время совать контекст везде? Какой смысл в это вкладывают создатели драйвера? Есть ли возможность не использовать его? Задать дефолтный?
Это сделано для возможности создания так называемого Graceful Shutdown. Не использовать его нельзя, но вы можете туда отправлять что-то вроде context.TODO(). Но лично мне проброс контекста очень нравится, потому что ошибки при окончании работы приложения сведутся к минимуму.
Я если честно все еще не понимаю как он связан с Graceful Shutdown. А проброс контекста требует в бизнес логике помимо коллекции принимать еще контекст, и так везде. Тот же mgo не требует контекста, в нем невозможен Graceful Shutdown? И где можно почитать про него? Беглое гугление не дало результатов.
Да, mgo частично лишен этого функционала. В первую очередь почитайте документацию по context.
Благодарю, просто я руками закрываю соединение в скриптах, думал этого достаточно.
Да, статья все разьяснила, благодарю
Sign up to leave a comment.

Articles