Menu Docs
Página inicial do Docs
/ /

Substituir documentos

Neste guia, você pode aprender como usar o driver Kotlin para substituir documentos em uma coleção MongoDB . Uma operação de substituição usa um filtro de query para corresponder a um documento em uma coleção e, em seguida, substitui o documento por um novo.

O métodoreplaceOne() remove todos os campos e valores existentes no documento correspondente (exceto o _id campo ) e insere os campos e valores do documento de substituição.

Você pode chamar o método replaceOne() em uma instância MongoCollection da seguinte forma:

collection.replaceOne(<query>, <replacementDocument>)

Se vários documentos corresponderem ao filtro de query especificado no método replaceOne(), a operação substituirá o primeiro resultado. Você pode especificar uma classificação em uma instância do ReplaceOptions para aplicar um pedido aos documentos correspondentes antes que o driver execute a operação de substituição, conforme mostrado no código a seguir:

val opts = ReplaceOptions().sort(Sorts.ascending(PaintOrder::color.name))

Se zero documentos corresponderem ao filtro de query na operação de substituição, replaceOne() não fará alterações nos documentos na coleção.Consulte o guia Upsert para saber como inserir um novo documento em vez de substituir um se nenhum documento corresponder.

Importante

O replaceOne() método não pode fazer alterações em um documento que viole restrições de índice único na collection. Consulte o manual do MongoDB Server para obter mais informações sobre índices únicos.

O método replaceOne() aceita os seguintes parâmetros:

Parâmetro
Descrição

filter

Um filtro de query que especifica o documento a ser substituído. Para obter mais informações sobre filtros de query, consulte o manual do MongoDB Server .

Tipo de Dados: BSON

replacement

Um documento de substituição, que especifica os campos e valores a serem inseridos no novo documento . Se os documentos em sua coleção estiverem mapeados para uma classe Kotlin , o documento de substituição poderá ser uma instância dessa classe.

Tipo de Dados: document: T

options

Opcional. Uma instância da classe ReplaceOptions que especifica a configuração para a operação de substituição. O valor padrão é null.

Tipo de Dados: ReplaceOptions

O método replaceOne() aceita opcionalmente um objeto ReplaceOptions como parâmetro, que representa as opções que você pode usar para configurar a operação de substituição.

A classe ReplaceOptions contém as seguintes propriedades:

Propriedade
Descrição

bypassDocumentValidation

Especifica se a operação de substituição ignora a validação do documento. Isso permite substituir documentos que não atendem aos requisitos de validação de esquema, se houver. Consulte o manual do servidor do MongoDB para obter mais informações sobre validação de esquema.

Tipo de Dados: booleano

collation

Especifica o tipo de agrupamento de idiomas a ser usado ao classificar os resultados.

Tipo de Dados: Agrupamentos

comment

Obtém ou define o comentário fornecido pelo usuário para a operação. Consulte o manual do servidor do MongoDB para obter mais informações.

Tipo de Dados: String ou BsonValue

hint

Obtém ou define o índice a ser usado para procurar documentos. Consulte o manual do servidor do MongoDB para obter mais informações.

Tipo de Dados: Bson

hintString

Obtém ou define o índice a ser usado para procurar documentos. Consulte o manual do servidor do MongoDB para obter mais informações.

Tipo de Dados: String

upsert

Especifica se a operação de substituição executa uma operação upsert se nenhum documento corresponder ao filtro de queries. Consulte o manual do servidor do MongoDB para obter mais informações.

Tipo de Dados: booleano

sort

Determina qual documento a operação substitui se a query selecionar vários documentos, pois a operação de substituição substitui o primeiro documento na ordem de classificação especificada.

Tipo de Dados: Bson

let

Obtém ou define o documento let para adicionar variáveis de nível superior para a operação. Consulte o manual do MongoDB Server para obter mais informações.

Tipo de Dados: Bson

Após a execução bem-sucedida, o método replaceOne() gera uma instância UpdateResult. A classe UpdateResult contém as seguintes propriedades:

Propriedade
Descrição

wasAcknowledged

Indica se a operação de substituição foi reconhecida pelo MongoDB.

Tipo de Dados: boolean

getMatchedCount

O número de documentos que corresponderam ao filtro de queries, independente de algum ter sido substituído.

Tipo de Dados: long

getModifiedCount

O número de documentos substituídos pela operação de substituição.

Tipo de Dados: long

getUpsertedId

O ID do documento que foi atualizado no banco de dados, se o driver executou um upsert.

Tipo de Dados: BsonValor

Se a sua operação de substituição falhar, o driver emitirá uma exceção.

Por exemplo, se o valor do campo _id em seu documento de substituição for diferente do valor no documento original , o método lançará o seguinte MongoWriteException:

After applying the update, the (immutable) field '_id' was found to have been altered to _id: ObjectId('...)

Se o documento de substituição contiver uma alteração que viole regras de índice único , o método gerará um MongoWriteException com uma mensagem de erro semelhante à seguinte:

E11000 duplicate key error collection: ...

Para obter mais informações sobre os tipos de exceções geradas em condições específicas, consulte a documentação da API para replaceOne(), cujo link está no final desta página.

Uma loja de tintas vende cinco cores diferentes de tinta. Os documentos na seguinte coleção representam cores de tinta no inventário da loja:

{ "_id": 1, "color": "red", "qty": 5 }
{ "_id": 2, "color": "purple", "qty": 8 }
{ "_id": 3, "color": "yellow", "qty": 0 }
{ "_id": 4, "color": "green", "qty": 6 }
{ "_id": 5, "color": "pink", "qty": 20 }

A seguinte classe de dados Kotlin modela esses dados:

data class PaintOrder(
@BsonId val id: Int,
val color: String,
val qty: Int
)

A loja de tintas deve atualizar seu inventário para substituir 20 latas de tinta cor de laranja por 25 latas de tinta laranja.

Para atualizar o inventário, chame o método replaceOne():

val filter = Filters.eq(PaintOrder::color.name, "pink")
val update = PaintOrder(5, "orange", 25)
val result = collection.replaceOne(filter, update)
println("Matched document count: $result.matchedCount")
println("Modified document count: $result.modifiedCount")
Matched document count: 1
Modified document count: 1

A operação de substituição anterior cria o seguinte documento:

{ "_id": 5, "color": "orange", "qty": 25 }

No exemplo a seguir, o replaceOne() método substitui a primeira correspondência do filtro de query na movies coleção do conjunto de dados Atlas por um documento de substituição. A operação exclui todos os campos, exceto,_id do documento original e insere os campos do documento de substituição. A seguinte Movie classe de dados modela os documentos nesta coleção para uso com o driver Kotlin :

data class Movie(
val title: String,
val year: Int,
val genres: List<String>,
val rated: String,
val plot: String,
val runtime: Int,
val imdb: IMDB,
val fullplot: String? = "No full plot",
){
data class IMDB(
val rating: Double
)
}

Dica

Métodos de construtor e propriedades de classe de dados

Você pode usar os métodos de classes de construtores diretamente com propriedades de classe de dados adicionando a dependência opcional de extensões de driver Kotlin ao seu aplicação. Para saber mais e ver exemplos, consulte o guia Use Builders with Data Classes.

Antes da operação replaceOne() ser executada, o documento original contém vários campos que descrevem o filme. Após a operação ser executada, o documento resultante conterá somente os campos especificados pelo documento de substituição (title e fullplot) e o campo _id .

O exemplo a seguir utiliza os seguintes objetos e métodos:

  • Um filtro de queries que é passado para o método replaceOne(). O filtro eq corresponde apenas a filmes com o título que corresponde exatamente ao texto "Music of the Heart".

  • Um documento de substituição que contém o documento que substitui o documento correspondente , se ele existir.

  • Um objeto ReplaceOptions com a upsert opção definida true como. Esta opção especifica que o método insere os dados contidos no documento de substituição se o filtro de query não corresponder a nenhum documento.

Observação

Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB , consulte o Guia de conexão.

import com.mongodb.MongoException
import com.mongodb.client.model.Filters
import com.mongodb.client.model.ReplaceOptions
import com.mongodb.kotlin.client.coroutine.MongoClient
import kotlinx.coroutines.runBlocking
data class Movie(val title: String, val fullplot: String)
fun main() = runBlocking {
// Replace the uri string with your MongoDB deployment's connection string
val uri = "<connection string uri>"
val mongoClient = MongoClient.create(uri)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Movie>("movies")
try {
val query = Filters.eq("title", "Music of the Heart")
val replaceDocument = Movie( "50 Violins", " A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music")
val options = ReplaceOptions().upsert(true)
val result = collection.replaceOne(query, replaceDocument, options)
println("Modified document count: " + result.modifiedCount)
println("Upserted id: " + result.upsertedId) // only contains a non-null value when an upsert is performed
} catch (e: MongoException) {
System.err.println("Unable to replace due to an error: $e")
}
mongoClient.close()
}

O exemplo anterior retorna a seguinte saída:

Modified document count: 1
Upserted id: null

Se o exemplo anterior resultou em um upsert, o código retornará a seguinte saída:

Modified document count: 0
Upserted id: BsonObjectId{value=...}

Se você fizer query do documento substituído, a query retornará a seguinte saída:

Movie(title=50 Violins, fullplot= A dramatization of the true story of Roberta Guaspari
who co-founded the Opus 118 Harlem School of Music)

Para saber mais sobre os métodos e classes utilizados nesta página, consulte a seguinte documentação da API:

Voltar

Documentos do Upsert

Nesta página