Operações em massa
Nesta página
Visão geral
Neste guia, você verá como usar as operações em massa.
As operações em massa executam um grande número de operações de gravação. Em vez de fazer uma chamada para cada operação no banco de dados, as operações em massa executam várias operações com uma única chamada ao banco de dados.
Dados de amostra
Os exemplos nesta aba usam o seguinte struct Book
como um modelo para documentos na coleção books
:
type Book struct { Title string Author string Length int32 }
Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.books
com o seguinte trecho:
coll := client.Database("db").Collection("books") docs := []interface{}{ Book{Title: "My Brilliant Friend", Author: "Elena Ferrante", Length: 331}, Book{Title: "Lucy", Author: "Jamaica Kincaid", Length: 103}, } result, err := coll.InsertMany(context.TODO(), docs)
Cada documento contém uma descrição de um livro que inclui o título, o autor e o comprimento da página correspondentes aos campos title
, author
e length
em cada documento.
Dica
Bancos de Dados e Coleções Inexistentes
Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.
Gravação em massa
Para executar uma operação em massa, passe uma array de documentos WriteModel para o método BulkWrite()
.
Modificar comportamento
Opcionalmente, o método BulkWrite()
usa o tipo BulkWriteOptions
, que representa as opções que você pode usar para modificar seu comportamento. Se você não especificar um BulkWriteOptions
, o driver utilizará os valores padrão para cada opção.
O tipo BulkWriteOptions
permite a você configurar opções com os seguintes métodos:
Método | Descrição |
---|---|
SetBypassDocumentValidation() | Whether to allow the write to opt-out of document level validation. Default: false |
SetOrdered() | Whether to stop performing write operations after an error occurs. Default: true |
Return Values
O método BulkWrite()
retorna um tipo BulkWriteResult
, que contém informações sobre a operação em massa, se ela for bem-sucedida. O tipo BulkWriteResult
contém as seguintes propriedades:
Propriedade | Descrição |
---|---|
InsertedCount | O número de documentos inseridos. |
MatchedCount | O número de documentos correspondidos pelofiltro de query nas operações de atualização e substituição. |
ModifiedCount | O número de documentos modificados por atualização e substituição de operações. |
DeletedCount | O número de documentos excluídos. |
UpsertedCount | O número de documentos atualizados por atualização e substituição de operações. |
UpsertedIDs | Um mapa de um índice de operação para o _id de cada documento atualizado. |
operações
Um WriteModel
representa uma operação de inserção, substituição, atualização ou exclusão.
Insert
Para executar uma operação de inserção, crie um InsertOneModel
especificando o documento que você deseja inserir. Para inserir vários documentos, crie um InsertOneModel
para cada documento que você deseja inserir.
O InsertOneModel
permite a você especificar seu comportamento com o seguinte método:
Método | Descrição |
---|---|
SetDocument() | The document to insert. |
Exemplo
Este exemplo seguinte cria duas instâncias do InsertOneModel
para inserir dois documentos:
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(Book{Title: "Beloved", Author: "Toni Morrison", Length: 324}), mongo.NewInsertOneModel().SetDocument(Book{Title: "Outline", Author: "Rachel Cusk", Length: 258}), }
Substituir
Para executar uma operação de substituição, crie um ReplaceOneModel
especificando o documento que deseja substituir e um documento de substituição. Para substituir vários documentos, crie um ReplaceOneModel
para cada documento que deseja substituir.
O ReplaceOneModel
permite a você especificar seu comportamento com os seguintes métodos:
Método | Descrição |
---|---|
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to replace. |
SetHint() | The index to use to scan for documents. |
SetReplacement() | The document to replace the matched document with. |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. |
Exemplo
O exemplo a seguir cria um ReplaceOneModel
para substituir um documento onde o title
é "Lucy" por um novo documento:
models := []mongo.WriteModel{ mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "Lucy"}}). SetReplacement(Book{Title: "On Beauty", Author: "Zadie Smith", Length: 473}), }
Update
Para executar uma operação de atualização, crie um UpdateOneModel
especificando o documento que você deseja atualizar e um documento de atualização. Para atualizar vários documentos, use o UpdateManyModel
.
O UpdateOneModel
e UpdateManyModel
permitem a você especificar seu comportamento com os seguintes métodos:
Método | Descrição |
---|---|
SetArrayFilters() | The array elements the update applies to. |
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to update. |
SetHint() | The index to use to scan for documents. |
SetUpdate() | The modifications to apply on the matched documents. |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. |
Exemplo
O exemplo a seguir cria uma UpdateOneModel
para diminuir a length
de um documento 15
se o author
for "Elena Ferrante":
models := []mongo.WriteModel{ mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}). SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}), }
Excluir
Para executar uma operação de exclusão, crie um DeleteOneModel
especificando o documento que você deseja excluir. Para excluir vários documentos, use o DeleteManyModel
.
O DeleteOneModel
e DeleteManyModel
permitem a você especificar seu comportamento com os seguintes métodos:
Método | Descrição |
---|---|
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to delete. |
SetHint() | The index to use to scan for documents. |
Exemplo
O exemplo abaixo cria um DeleteManyModel
para excluir documentos onde o length
é maior que 300
:
models := []mongo.WriteModel{ mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}), }
Ordem de execução
O método BulkWrite()
permite a você especificar se você deseja executar as operações em massa como ordenadas ou não ordenadas em seu BulkWriteOptions
.
Pedido
Por padrão, o método BulkWrite()
executa operações em massa para que você as adicione e pare se ocorrer um erro.
Dica
Isto é equivalente a especificar true
no método SetOrdered()
:
opts := options.BulkWrite().SetOrdered(true)
Não ordenado
Para executar operações de gravação em massa em qualquer ordem e continuar se ocorrer um erro, especifique false
no método SetOrdered()
. O método relata os erros posteriormente.
Exemplo
O exemplo a seguir executa as seguintes ações em qualquer ordem:
Insere dois documentos.
Substitui um documento onde o
title
é "Meu amigo brilhante" por um novo documento.Aumenta o
length
de cada documento em10
se o valor atual delength
for menor que200
.Exclui todos os documentos onde o valor do campo
author
inclui "Jam".
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(Book{Title: "Middlemarch", Author: "George Eliot", Length: 904}), mongo.NewInsertOneModel().SetDocument(Book{Title: "Pale Fire", Author: "Vladimir Nabokov", Length: 246}), mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "My Brilliant Friend"}}). SetReplacement(Book{Title: "Atonement", Author: "Ian McEwan", Length: 351}), mongo.NewUpdateManyModel().SetFilter(bson.D{{"length", bson.D{{"$lt", 200}}}}). SetUpdate(bson.D{{"$inc", bson.D{{"length", 10}}}}), mongo.NewDeleteManyModel().SetFilter(bson.D{{"author", bson.D{{"$regex", "Jam"}}}}), } opts := options.BulkWrite().SetOrdered(false) results, err := coll.BulkWrite(context.TODO(), models, opts) if err != nil { panic(err) } fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount) fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount) fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)
Os seguintes documentos estão presentes na collection books
após a operação em massa:
{"title":"Atonement","author":"Ian McEwan","length":351} {"title":"Middlemarch","author":"George Eliot","length":904} {"title":"Pale Fire","author":"Vladimir Nabokov","length":246}
Informações adicionais
Para obter um exemplo executável sobre como executar uma operação em massa, consulte Executar operações em massa.
Operações relacionadas
Para saber mais sobre como executar as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: