Operações compostas
Nesta página
Visão geral
Neste guia, você aprenderá a realizar operações compostas.
As operações compostas combinam uma operação de leitura e gravação em uma única operação. Se você executar uma operação de leitura e gravação separadamente, há uma chance de que outra pessoa altere o documento entre as duas operações. O MongoDB evita isso colocando um bloqueio de gravação no documento que você está modificando durante a operação composta.
O MongoDB é compatível com as seguintes operações compostas:
Dica
Se você precisar ler e escrever em mais de um documento, use transações.
Dados de amostra
Execute o seguinte trecho para carregar os documentos na coleção tea.ratings
:
coll := client.Database("tea").Collection("ratings") docs := []interface{}{ bson.D{{"type", "Masala"}, {"rating", 10}}, bson.D{{"type", "Assam"}, {"rating", 5}}, bson.D{{"type", "Oolong"}, {"rating", 7}}, bson.D{{"type", "Earl Grey"}, {"rating", 8}}, bson.D{{"type", "English Breakfast"}, {"rating", 5}}, } result, err := coll.InsertMany(context.TODO(), docs) if err != nil { panic(err) } fmt.Printf("Number of documents inserted: %d\n", len(result.InsertedIDs))
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á.
Cada documento contém uma classificação para um tipo de chá que corresponde aos campos type
e rating
.
Observação
Cada exemplo trunca o valor ObjectID
porque o driver o gera exclusivamente.
Localize e exclua
O método FindOneAndDelete()
encontra o primeiro documento que corresponde ao filtro de query especificado e o exclui. O método retorna um SingleResult
contendo o documento excluído.
Observação
Este método é diferente do método DeleteOne()
. O FindOneAndDelete()
executa uma localização e uma exclusão como uma única operação e elimina a possibilidade de alguém alterar um documento entre ambas as operações.
Modificar comportamento
Você pode modificar o comportamento do método FindOneAndDelete()
passando um FineOneAndDeleteOptions
. Se você não especificar um FineOneAndDeleteOptions
, o driver utilizará os valores padrão para cada opção.
O tipo FineOneAndDeleteOptions
permite a você configurar opções com os seguintes métodos:
Método | Descrição |
---|---|
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetHint() | The index to use to scan for documents. Default: nil |
Exemplo
O exemplo a seguir corresponde e exclui um documento onde o type
é "Assam" com o método FindOneAndDelete()
:
filter := bson.D{{"type", "Assam"}} var deletedDoc bson.D err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc) if err != nil { panic(err) } fmt.Println(deletedDoc)
Encontrar e atualizar
O método FindOneAndUpdate()
localiza o primeiro documento que corresponde ao filtro de query especificado e o atualiza de acordo com o documento de atualização. O método retorna um SingleResult
que contém o documento correspondente.
Observação
Este método é diferente do método UpdateOne()
. FindOneAndUpdate()
executa uma localização e uma atualização como uma única operação e elimina a possibilidade de alguém alterar um documento entre ambas as operações.
Modificar comportamento
Você pode modificar o comportamento do método FindOneAndUpdate()
passando um FineOneAndUpdateOptions
. Se você não especificar um FineOneAndUpdateOptions
, o driver utilizará os valores padrão para cada opção.
O tipo FineOneAndUpdateOptions
permite a você configurar opções com os seguintes métodos:
Método | Descrição |
---|---|
SetArrayFilters() | The array elements the update applies to. Default: nil |
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or updated document in the SingleResult .Default: options.Before |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | The index to use to scan for documents. Default: nil |
Exemplo
O exemplo a seguir executa as seguintes ações em ordem com o método FindOneAndUpdate()
:
Corresponde a um documento onde o
type
é "Oolong"Atualiza o
rating
do documento correspondente para9
Retorna o documento atualizado
filter := bson.D{{"type", "Oolong"}} update := bson.D{{"$set", bson.D{{"rating", 9}}}} opts := options.FindOneAndUpdate().SetReturnDocument(options.After) var updatedDoc bson.D err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } fmt.Println(updatedDoc)
Encontrar e substituir
O método FindOneAndReplace()
localiza o primeiro documento que corresponde ao filtro de query especificado e o substitui pelo documento de substituição. O método retorna um SingleResult
contendo o documento correspondente.
Observação
Este método é diferente do método ReplaceOne()
. FindOneAndReplace()
executa uma localização e substituição como uma única operação e elimina a possibilidade de alguém alterar um documento entre as duas operações.
Modificar comportamento
Você pode modificar o comportamento do método FindOneAndReplace()
passando um FineOneAndReplaceOptions
. Se você não especificar um FineOneAndReplaceOptions
, o driver utilizará os valores padrão para cada opção.
O tipo FineOneAndReplaceOptions
permite a você configurar opções com os seguintes métodos:
Método | Descrição |
---|---|
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or replaced document in the SingleResult .Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | The index to use to scan for documents. Default: nil |
Exemplo
O exemplo a seguir executa as seguintes ações em ordem com o método FindOneAndReplace()
:
Corresponde a um documento onde o
type
é " English pequeno-almoço "Substitui o documento correspondente por um novo documento em que o
type
é "Cylon" erating
é6
filter := bson.D{{"type", "English Breakfast"}} replacement := bson.D{{"type", "Ceylon"}, {"rating", 6}} var previousDoc bson.D err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc) if err != nil { panic(err) } fmt.Println(previousDoc)
Informações adicionais
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: