Комментарии 12
Писал, недавно свой такой, getOne мне кажется в моем случае более оптимизированный
Если интересно могу выложить в opensource, правда операций поменьше:
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()
}
Хм, как, однако, много изменилось с альфы. Буквально пару месяцев назад(0.0.17) работа с bson вообще по-другому выглядела — использовалось куча
Рад, что все стало намного аккуратнее. Из хотелок — не появилось ли возможности оборачивать кастомные структуры в bson.D? Например, что бы можно было писать что-то наподобие
бойлерплейтных билдеров
.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? И где можно почитать про него? Беглое гугление не дало результатов.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
MongoDB Go Driver туториал