Visão geral
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.
Substituir um documento
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.
Substituir parâmetros de operação
O método replaceOne() aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| 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 |
| 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: |
| Opcional. Uma instância da classe Tipo de Dados: ReplaceOptions |
Personalizar a operação de substituição
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 |
|---|---|
| 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 |
| Especifica o tipo de agrupamento de idiomas a ser usado ao classificar os resultados. Tipo de Dados: Agrupamentos |
| 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. |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
Valor de retorno
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 |
|---|---|
| Indica se a operação de substituição foi reconhecida pelo MongoDB. Tipo de Dados: |
| O número de documentos que corresponderam ao filtro de queries, independente de algum ter sido substituído. Tipo de Dados: |
| O número de documentos substituídos pela operação de substituição. Tipo de Dados: |
| O ID do documento que foi atualizado no banco de dados, se o driver executou um upsert. Tipo de Dados: BsonValor |
Exceções
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.
Substituir um exemplo
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( 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 }
Exemplo de substituição avançada um
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 filtroeqcorresponde 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
upsertopção definidatruecomo. 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)
Informações adicionais
Para saber mais sobre os métodos e classes utilizados nesta página, consulte a seguinte documentação da API: