Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Bulk.find.upsert()

Nesta página

  • Descrição
  • Comportamento

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 gravação:

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")
}

Dica

Veja também:

Voltar

Bulk.find.update