O MongoDB
$setOnInsert
O operador de atualização de campo pode ser usado para inserir um valor específico durante um upsert. Se uma operação de atualização resultar na inserção de um novo documento (ou seja, um upsert), então o
$setOnInsert
operador entra em vigor, caso contrário não tem efeito. Exemplo
Suponha que tenhamos uma coleção chamada
dogs
com o seguinte documento:{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
E executamos o seguinte
update()
comando para atualizar um documento que não existe na coleção:db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Isso resultará na seguinte saída:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
O que nos diz que um documento foi alterado.
Vamos conferir a coleção:
db.dogs.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Podemos ver que o documento 2 foi inserido e inclui o campo/valor que fornecemos para o
$setOnInsert
operador (ou seja, name: "Bark"
). Quando o documento existe (ou seja, sem atualização)
Agora vamos tentar atualizar o documento que acabamos de upser. Vamos usar a mesma instrução do exemplo anterior, mas com valores diferentes.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Saída:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Desta vez, um documento correspondeu e foi atualizado. Nada foi revirado.
Vamos verificar a coleção novamente.
db.dogs.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Portanto, neste caso, o
weight
e height
campos foram atualizados, mas o name
campo não era. O motivo pelo qual o campo de nome não foi atualizado é porque um upsert não estava sendo executado. O
$setOnInsert
O operador especifica apenas o campo/valor a ser definido quando a operação de atualização resulta na inserção de um novo documento (ou seja, um upsert).