Menu Docs
Página inicial do Docs
/ / /
Go
/ /

Operações compostas

Nesta página

  • Visão geral
  • Localize e exclua
  • Encontrar e atualizar
  • Encontrar e substituir
  • Informações adicionais

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:

  • Encontrar e excluir um documento

  • Localizar e atualizar um documento

  • Localizar e substituir um documento

Dica

Se você precisar ler e gravar em mais de um documento, use transações.

Os exemplos nesta aba usam o seguinte struct Course como um modelo para documentos na coleção courses:

type Course struct {
Title string
Enrollment int32
}

Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.courses com o seguinte trecho:

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "Representation Theory", Enrollment: 40},
Course{Title: "Early Modern Philosophy", Enrollment: 25},
Course{Title: "Animal Communication", Enrollment: 18},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contém uma descrição de um curso universitário que inclui o nome do curso e o número máximo de matrículas, correspondentes aos campos title e enrollment 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á.

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

O método FindOneAndDelete() é uma operação atômica, o que significa que impede que qualquer outra operação de gravação altere o documento correspondente até que ele seja concluído. O método deleteOne() também é uma operação atômica, mas difere do FindOneAndDelete() porque você não pode especificar uma ordem de classificação para os documentos correspondentes.

Se você não precisar localizar e excluir um documento em uma única transação, pode chamar o método findOne() seguido pelo método deleteOne() .

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

O exemplo a seguir utiliza o método FindOneAndDelete() para corresponder e excluir o primeiro documento em que o valor do campo enrollment seja menor que 20:

filter := bson.D{{"enrollment", bson.D{{"$lt", 20}}}}
var deletedDoc Course
err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(deletedDoc, false, false)
fmt.Println(string(res))

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

O método FindOneAndUpdate() é uma operação atômica, o que significa que impede que qualquer outra operação de gravação altere o documento correspondente até que ele seja concluído. O método updateOne() também é uma operação atômica, mas difere do FindOneAndUpdate() porque você não pode especificar uma ordem de classificação para os documentos correspondentes.

Se não precisar localizar e atualizar um documento em uma única transação, você pode chamar o método findOne() seguido pelo método updateOne() .

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

O exemplo a seguir usa o método FindOneAndUpdate() para executar as ações a seguir em ordem:

  • Corresponde ao primeiro documento onde o valor do campo title inclui "Moderno"

  • Atualiza o valor de campo enrollment do documento correspondente para 32

  • Retorna o documento atualizado

filter := bson.D{{"title", bson.D{{"$regex", "Modern"}}}}
update := bson.D{{"$set", bson.D{{"enrollment", 32}}}}
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
var updatedDoc Course
err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(updatedDoc, false, false)
fmt.Println(string(res))

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.

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

O exemplo a seguir usa o método FindOneAndReplace() para executar as ações a seguir em ordem:

  • Corresponde ao primeiro documento onde o title é "teoria de representação"

  • Substitui o documento correspondente por um novo documento onde o title é "Teoria Combinatória" e o enrollment é 35

filter := bson.D{{"title", "Representation Theory"}}
replacement := Course{Title: "Combinatorial Theory", Enrollment: 35}
var outdatedDoc Course
err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(outdatedDoc, false, false)
fmt.Println(string(res))

Para saber mais sobre como executar as operações mencionadas, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Operações em massa