高朗MongoDB bulkWrite()更新文档切片

时间:2019-10-24 09:47:14

标签: mongodb go

我有一部分要保存到Mongo集合中的对象。假设

type (
    User struct {
        AccountId       string
        Name            string
        FamilyName      string
        EmailAddress    string
    }
)

func persistUsers(ctx context.Context, db *mongo.Collection, users []User) {

}

有些用户已经保存,有些则没有。我想重新切片。因此,我有两个问题:

  1. 如何使用mongo.Collection.BulkWrite()?我找不到明显的解释如何将对象切片放入其中。

  2. mongo如何确定新的,旧的和必须更新的?根据{{​​1}}?

1 个答案:

答案 0 :(得分:2)

  

如何使用mongo.Collection.BulkWrite()?

此示例代码基于MongoDB Go driver v1.1.2。首先,您需要导入以下内容:

"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/bson"

下面是Collection.BulkWrite的示例代码,并使用了User结构示例:

collection := client.Database("databaseName").Collection("collectionName")

var operations []mongo.WriteModel

// Example using User struct
userA := User{AccountId:"1", Name:"John", FamilyName:"Smith", EmailAddress:"john@example.org"}

operationA := mongo.NewUpdateOneModel()
operationA.SetFilter(bson.M{"AccountId": userA.AccountId}) 
operationA.SetUpdate(bson.M{"Name":userA.Name, 
                            "FamilyName":userA.FamilyName, 
                            "EmailAddress":userA.EmailAddress})
// Set Upsert flag option to turn the update operation to upsert
operationA.SetUpsert(true) 
operations = append(operations, operationA)

// Example using bson.M{}
operationB := mongo.NewUpdateOneModel()
operationB.SetFilter(bson.M{"AccountId":2}) 
operationB.SetUpdate(bson.M{"Name":"Jane", 
                              "FamilyName":"Smith", 
                              "EmailAddress":"jane@example.org"})
operationB.SetUpsert(true) 
operations = append(operations, operationB)

// Specify an option to turn the bulk insertion in order of operation
bulkOption := options.BulkWriteOptions{}
bulkOption.SetOrdered(true)

result, err := collection.BulkWrite(context.TODO(), operations, &bulkOption)
if err != nil {
        log.Fatal(err)
}
fmt.Println(result)

有关更多信息,请参见:

  

mongo如何确定什么是新的,什么是旧的以及必须更新?

如果没有符合查询条件的文档(过滤器),则update()将插入一个文档。如果存在符合查询条件的文档,它将成为更新。另请参阅Upsert Behaviour,以了解更多信息。

如果您的更新查询条件包含_iddot notation,请参阅Upsert With Dotted _id Query