MongoDB $setOnInsert
Операторът за актуализиране на полето може да се използва за вмъкване на конкретна стойност по време на прехвърляне.
Ако операцията за актуализиране води до вмъкване на нов документ (т.е. upsert), тогава $setOnInsert
операторът влиза в сила, в противен случай няма ефект.
Пример
Да предположим, че имаме колекция, наречена dogs
със следния документ:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
И стартираме следния update()
команда за актуализиране на документ, който не съществува в колекцията:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Това ще доведе до следния изход:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Което ни казва, че един документ е бил поместен.
Нека проверим колекцията:
db.dogs.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Можем да видим, че документ 2 е вмъкнат и включва полето/стойността, която предоставихме за $setOnInsert
оператор (т.е. name: "Bark"
).
Когато документът съществува (т.е. няма добавка)
Сега нека се опитаме да актуализираме документа, който току-що поставихме. Нека използваме същото изявление като в предишния пример, но с различни стойности.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Този път един документ съвпадна и беше актуализиран. Нищо не беше разстроено.
Нека проверим колекцията отново.
db.dogs.find()
Резултат:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Така че в този случай weight
и height
полетата бяха актуализирани, но name
полето не беше.
Причината, поради която полето за име не е актуализирано, е, че не е било извършено upsert. $setOnInsert
Операторът посочва само полето/стойността, която да се зададе, когато операцията за актуализиране води до вмъкване на нов документ (т.е. upsert).