sql >> Database >  >> NoSQL >> MongoDB

MongoDB $setOnInsert

De MongoDB $setOnInsert field update-operator kan worden gebruikt om een ​​specifieke waarde in te voegen tijdens een upsert.

Als een update-bewerking ertoe leidt dat een nieuw document wordt ingevoegd (d.w.z. een upsert), dan is de $setOnInsert operator wordt van kracht, anders heeft het geen effect.

Voorbeeld

Stel dat we een verzameling hebben met de naam dogs met het volgende document:

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

En we draaien de volgende update() commando om een ​​document bij te werken dat niet in de collectie bestaat:

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

Dit resulteert in de volgende uitvoer:

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

Wat ons vertelt dat één document is gekraakt.

Laten we de collectie eens bekijken:

db.dogs.find()

Resultaat:

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

We kunnen zien dat document 2 is ingevoegd en het bevat het veld/de waarde die we hebben opgegeven voor de $setOnInsert operator (d.w.z. name: "Bark" ).

Wanneer het document bestaat (d.w.z. geen upsert)

Laten we nu proberen het document dat we zojuist hebben bijgewerkt, bij te werken. Laten we dezelfde instructie gebruiken als in het vorige voorbeeld, maar met andere waarden.

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

Uitgang:

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

Deze keer kwam één document overeen en werd het bijgewerkt. Niets was verstoord.

Laten we de collectie nog eens bekijken.

db.dogs.find()

Resultaat:

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

Dus in dit geval is het weight en height velden zijn bijgewerkt, maar de name veld niet.

De reden dat het naamveld niet is bijgewerkt, is omdat er geen upsert werd uitgevoerd. De $setOnInsert operator specificeert alleen het veld/de waarde die moet worden ingesteld wanneer de update-bewerking resulteert in het invoegen van een nieuw document (d.w.z. een upsert).


  1. MongoDB:vind waarde in array met meerdere criteria

  2. Latentie begrijpen met Redis-Cli

  3. BsonSerializationException bij het serialiseren van een Dictionary<DateTime,T> naar BSON

  4. Future of Hadoop - Salarissen en baanvoorspellingen in big data-analyse