Golang. MongoDB bulkWrite () для обновления фрагмента документов - PullRequest
1 голос
/ 24 октября 2019

У меня есть часть объектов, которые я хочу сохранить в коллекции 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. Как Монго решает, что нового, что старое и что нужно обновить? Согласно _id?

1 Ответ

2 голосов
/ 26 октября 2019

Как использовать mongo.Collection.BulkWrite ()?

Этот пример кода основан на драйвере MongoDB Go 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)

Для получения дополнительной информации см .:

Как монго решает, что нового, что старое и что нужно обновить?

Если документ не соответствует критериям запроса (фильтр), тогда update() вставляет один документ. Если есть документы, которые соответствуют критериям запроса, это становится обновлением. См. Также Upsert Behavior для получения дополнительной информации.

Если критерии запроса на обновление содержат _id с точечной нотацией , см. Upsert With Dotted _id Запрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...