sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $setOnInsert

MongoDB $setOnInsert field update operator kan användas för att infoga ett specifikt värde under en upsert.

Om en uppdateringsåtgärd resulterar i att ett nytt dokument infogas (d.v.s. en upsert), då $setOnInsert operatören träder i kraft, annars har den ingen effekt.

Exempel

Anta att vi har en samling som heter dogs med följande dokument:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }

Och vi kör följande update() kommando för att uppdatera ett dokument som inte finns i samlingen:

db.dogs.update(
  { _id: 2 },
  {
     $set: { weight: 50, height: 40 },
     $setOnInsert: { name: "Bark" }
  },
  { upsert: true }
)

Detta kommer att resultera i följande utdata:

WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })

Vilket säger oss att ett dokument har rubbats.

Låt oss kolla samlingen:

db.dogs.find()

Resultat:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }

Vi kan se att dokument 2 har infogats och det inkluderar fältet/värdet som vi angav för $setOnInsert operatör (dvs. name: "Bark" ).

När dokumentet finns (d.v.s. Inget uppslag)

Låt oss nu försöka uppdatera dokumentet vi nyss upphävde. Låt oss använda samma påstående som i föregående exempel, men med andra värden.

db.dogs.update(
  { _id: 2 },
  {
     $set: { weight: 55, height: 45 },
     $setOnInsert: { name: "Fluffy" }
  },
  { upsert: true }
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Den här gången matchade ett dokument och uppdaterades. Ingenting var upprört.

Låt oss kolla in samlingen igen.

db.dogs.find()

Resultat:

{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }

Så i det här fallet, weight och height fälten uppdaterades, men name fältet var det inte.

Anledningen till att namnfältet inte uppdaterades är att en upsert inte utfördes. $setOnInsert operatorn anger bara fältet/värdet som ska ställas in när uppdateringsåtgärden resulterar i att ett nytt dokument infogas (dvs. en upsert).


  1. Redis auth-fel med Node.js och socket.io

  2. Hur frågar du *korrekt* Redis från Tornado?

  3. hdel inuti hget block nodejs redis

  4. replica Set mongo docker-compose