Я перехожу с драйвера mgo, и моя функция выглядит так:
queue := collection.Bulk()
for j := range changes {
..
queue.Update(doc, update)
}
saveResult, err := queue.Run()
Это делает некоторые обновления $push
и $set
в одном документе в цикле.
Как это сделать с официальным драйвером? Это collection.BulkWrite()
или collection.UpdateMany()
? Документация настолько расплывчата, что я не понимаю, как их использовать и в чем разница. Любая помощь будет оценена по достоинству.
Для вашего варианта использования вы должны использовать collection.BulkWrite
. Вы можете найти примеры использования go-mongo-driver
в каталог примеров репозитория.
collection.UpdateMany()
обновит несколько документов в коллекции, используя один и тот же фильтр обновления и модификации. В документы эквивалента оболочки mongo гораздо больше документации. Пример:
result, err := coll.UpdateMany(
context.Background(),
bson.NewDocument(
bson.EC.SubDocumentFromElements("qty",
bson.EC.Int32("$lt", 50),
),
),
bson.NewDocument(
bson.EC.SubDocumentFromElements("$set",
bson.EC.String("size.uom", "cm"),
bson.EC.String("status", "P"),
),
bson.EC.SubDocumentFromElements("$currentDate",
bson.EC.Boolean("lastModified", true),
),
),
)
collection.BulkWrite()
выполнит набор операции массовой записи. Несколько дней назад BulkWrite API был только представил для драйвера go. Есть небольшие примеры, но вы всегда можете проверить тесты
файлы. Пример:
var operations []mongo.WriteModel
operation := mongo.NewUpdateOneModel()
operation.Filter(bson.NewDocument(
bson.EC.SubDocumentFromElements("qty",
bson.EC.Int32("$lt", 50),
),
))
operation.Update(bson.NewDocument(
bson.EC.SubDocumentFromElements("$set",
bson.EC.String("size.uom", "cm"),
bson.EC.String("status", "P"),
),
bson.EC.SubDocumentFromElements("$currentDate",
bson.EC.Boolean("lastModified", true),
),
))
operations = append(operations, operation)
result, err := coll.BulkWrite(
context.Background(),
operations,
)
Большое, большое спасибо! Похоже, я решил мигрировать, когда это станет возможным. Сам того не зная)