Bulk.find.upsert()
Nesta página
Dica
O MongoDB também fornece o método db.collection.bulkWrite()
para executar operações de gravação em massa.
Descrição
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 comotrue
, se não existirem documentos correspondentes para a condiçãoBulk.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 gravação:
Comportamento
O seguinte descreve o comportamento de inserção de várias operações de gravação quando utilizado em conjunto com Bulk.find.upsert()
.
Inserir para Bulk.find.replaceOne()
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 }
Inserir para Bulk.find.updateOne()
O método Bulk.find.updateOne()
aceita como seu parâmetro:
um documento de substituição que contém apenas pares de campos e valores (iguais aos
Bulk.find.replaceOne()
),um documento de atualização que contém apenas expressões de operadores de atualização ou
um pipeline de agregação.
Pares de campo e valor
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" }
Atualizar expressões do operador
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 }
Pipeline de agregação
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") }
Inserir para Bulk.find.update()
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:
um documento de atualização que contém apenas expressões de operadores de atualização ou
um pipeline de agregação.
Atualizar expressões do operador
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" }
Pipeline de agregação
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 deNOW
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") }