如何使用MongoDB的Go驱动程序BulkWrite \ UpdateMany

时间:2018-10-27 08:05:13

标签: go mongo-go

我正在从mgo驱动程序迁移,我的功能如下所示:

queue := collection.Bulk()
for j := range changes {
    ..
    queue.Update(doc, update)
}
saveResult, err := queue.Run()

这会对循环中的单个文档进行$push$set一些更新。 我应该如何与官方司机一起做?是collection.BulkWrite()还是collection.UpdateMany()?文档是如此含糊,我迷失了两者的用法以及两者之间的区别。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

对于您的用例,您将使用collection.BulkWrite。您可以在存储库的examples directory中找到有关如何使用go-mongo-driver的示例。

collection.UpdateMany()将使用相同的更新过滤器和修改来更新集合中的多个文档。在等效于mongo shell的docs中还有很多文档。示例:

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()将执行一组bulk write operations。前几天introduced才有go驱动程序的BulkWrite API。例子很少,但是您可以随时检查测试  文件。示例:

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,
)