Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.

Bulk.find.upsert() (método mongosh)

Dica

O MongoDB também fornece o método db.collection.bulkWrite() para executar operações de gravação em massa.

Bulk.find.upsert()

Define a opção upsert como true para uma atualização ou uma operação de substituição e tem a seguinte sintaxe:

Bulk.find(<query>).upsert().update(<update>);Bulk.find(<query>).upsert().updateOne(<update>);Bulk.find(<query>).upsert().replaceOne(<replacement>);

Com a opção upsert definida como true, se não existirem documentos correspondentes para a condição Bulk.find(), a operação de atualização ou substituição executará uma inserção. Se houver um documento correspondente, a operação de atualização ou substituição executará a atualização ou substituição especificada.

Utilize o Bulk.find.upsert() com as seguintes operações de escrita:

Esse comando está disponível em implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

Observação

Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas a todos os comandos, consulte Comandos não suportados.

O seguinte descreve o comportamento de inserção de várias operações de gravação quando utilizado em conjunto com Bulk.find.upsert().

O método Bulk.find.replaceOne() aceita, como parâmetro, um documento de substituição que contém apenas pares de campos e valores:

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { item: "abc123" } ).upsert().replaceOne( { item: "abc123", status: "P", points: 100, });bulk.execute();

Se a operação de substituição com a opção Bulk.find.upsert() executar uma inserção, o documento inserido será o documento de substituição. Se nem o documento de substituição nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id" : ObjectId("52ded3b398ca567f5c97ac9e"), "item" : "abc123", "status" : "P", "points" : 100}

O método Bulk.find.updateOne() aceita como seu parâmetro:

Se o parâmetro for um documento de substituição que contenha apenas pares de campos e valores:

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { status: "P" } ).upsert().updateOne( { item: "TBD", points: 0, inStock: true, status: "I" });bulk.execute();

Então, se a operação de atualização com a opção Bulk.find.upsert() executar uma inserção, o documento inserido será o documento de substituição. Se nem o documento de substituição nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id" : ObjectId("52ded5a898ca567f5c97ac9f"), "item" : "TBD", "points" : 0, "inStock" : true, "status" : "I"}

Se o parâmetro for um documento de atualização que contenha apenas expressões de operador de atualização:

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { status: "P", item: null } ).upsert().updateOne( { $setOnInsert: { qty: 0, inStock: true }, $set: { points: 0 } });bulk.execute();

Então, se a operação de atualização com a opção Bulk.find.upsert() executar uma inserção, a operação de atualização inserirá um documento com campo e valores do documento de query do método Bulk.find() e, em seguida, aplica as atualizações especificadas do documento de atualização. Se nem o documento de atualização nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id" : ObjectId("5e28d1a1500153bc2872dadd"), "item" : null, "status" : "P", "inStock" : true, "points" : 0, "qty" : 0}

Os métodos de atualização podem aceitar um pipeline de agregação. Por exemplo, os seguintes usos:

  • o estágio $replaceRoot que pode proporcionar um comportamento semelhante ao de uma expressão do operador de atualização $setOnInsert,

  • o estágio $set, que pode fornecer um comportamento semelhante à expressão do operador de atualização $set,

  • A variável de agregação NOW, que produz a data/hora atual e pode fornecer comportamento semelhante a uma expressão de operador de atualização$currentDate.

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { item: "Not Found", status: "P" } ).upsert().updateOne( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ]);bulk.execute();

Então, se a operação de atualização com a opção Bulk.find.upsert() executar uma inserção, a operação de atualização inserirá um documento com campo e valores do documento de query do método Bulk.find() e aplicará o pipeline de agregação especificado. Se nem o documento de atualização nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id" : ObjectId("5e28cf1e500153bc2872d49f"), "qty" : 0, "inStock" : true, "item" : "Not Found", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-22T22:39:26.789Z")}

Ao utilizar o upsert() com o método de atualização de vários documentos Bulk.find.update(), se nenhum documento corresponder à condição de query, a operação de atualização inserirá um documento único.

O método Bulk.find.update() aceita como seu parâmetro:

Se o parâmetro for um documento de atualização que contenha apenas expressões de operador de atualização:

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { status: "P" } ).upsert().update( { $setOnInsert: { qty: 0, inStock: true }, $set: { status: "I", points: "0" } });bulk.execute();

Então, se a operação de atualização com a opção Bulk.find.upsert() executar uma inserção, a operação de atualização inserirá um único documento com os campos e valores do documento de query do método Bulk.find() e aplica então a atualização especificada do documento de atualização. Se nem o documento de atualização nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id": ObjectId("52ded81a98ca567f5c97aca1"), "status": "I", "qty": 0, "inStock": true, "points": "0"}

Os métodos de atualização podem aceitar um pipeline de agregação. Por exemplo, os seguintes usos:

  • o estágio $replaceRoot que pode proporcionar um comportamento semelhante ao de uma expressão do operador de atualização $setOnInsert,

  • o estágio $set, que pode fornecer um comportamento semelhante à expressão do operador de atualização $set,

  • a variável de agregação NOW, que produz a data e hora atual e pode fornecer um comportamento semelhante à expressão do operador de atualização $currentDate. O valor de NOW permanece o mesmo em todo o pipeline. Para acessar variáveis de agregação, prefixe a variável com cifrões duplos $$ e coloque entre aspas.

var bulk = db.items.initializeUnorderedBulkOp();bulk.find( { item: "New Item", status: "P" } ).upsert().update( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ]);bulk.execute();

Então, se a operação de atualização com a opção Bulk.find.upsert() executar uma inserção, a operação de atualização inserirá um único documento com os campos e valores do documento de query do método Bulk.find() e aplicará o pipeline de agregação. Se nem o documento de atualização nem o documento de query especificar um campo _id, o MongoDB adicionará o campo _id:

{ "_id" : ObjectId("5e2920a5b4c550aad59d18a1"), "qty" : 0, "inStock" : true, "item" : "New Item", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-23T04:27:17.780Z")}