MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $setOnInsert


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).