sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB Upsert Forklaret

Mange opdateringsoperationer i MongoDB har potentiale til at være upserts. En upsert er en kombination af en indsættelse og en opdatering.

Det fungerer sådan her:Du udfører en opdateringshandling baseret på filterkriterier, og hvis der er nogen match, opdateres kun de matchede dokumenter, men hvis der ikke er matches, indsættes et nyt dokument.

Eksempel

Antag, at vi har en samling kaldet pets der indeholder følgende dokumenter:

 { "_id" : 1, "name" : "Wag", "type" : "Dog" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" } 

Vi kunne udføre følgende opdateringshandling, der indstiller upsert parameter til true :

db.pets.updateOne( 
    { name: "Wag" },
    { $set: { type: "Cow" } },
    { upsert: true }
    )

Resultat:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } 

I dette tilfælde var der et matchende dokument (dvs. der er et dokument med name: "Wag" ), og derfor blev det matchende dokument opdateret. Der blev ikke indsat noget.

Vi kan bekræfte dette på følgende måde:

db.pets.find()

Resultat:

 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" } 

Det første dokument har nu en type af Cow .

Lad os køre endnu en opdatering, igen ved at bruge upsert: true . Men denne gang vil der ikke være noget matchende dokument at opdatere.

db.pets.updateOne( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Resultat:

 {
 "acknowledged" : true,
 "matchedCount" : 0,
 "modifiedCount" : 0,
 "upsertedId" : ObjectId("5fe1b4c8d9914101694100b7")
 } 

I dette eksempel forsøger vi at finde et dokument, der har name: "Bubbles" men der er ingen at finde.

Denne gang kan vi se, at matchedCount er 0 , og modifiedCount er også 0 . Det betyder, at ingen af ​​de eksisterende dokumenter blev opdateret.

Vi kan også se, at et upsertedId blev returneret, hvilket betyder, at et dokument blev slettet.

Lad os tage endnu et kig på samlingen af ​​dokumenter:

db.pets.find()

Resultat:

 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" } 

Vi kan se, at et nyt dokument blev indsat/oprettet, og det har samme ID som angivet ovenfor.

Oprykningen skete, fordi der denne gang ikke var nogen matchende dokumenter at opdatere (og så et nyt blev indsat/opsat i stedet).

Hvis vi ikke havde indstillet upsert: true , ville det dokument ikke være blevet indsat.

Upsert på masseopdateringer

Når du udfører en masseopdatering, hvis du vil angive upsert: true , skal du bruge det med Bulk.find.upsert() .

Dette kan bruges med følgende skriveoperationer:

  • Bulk.find.replaceOne()
  • Bulk.find.updateOne()
  • Bulk.find.update()

Syntaksen ser sådan ud:

Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);

Eksempel:

var bulk = db.pets.initializeUnorderedBulkOp();
bulk.find( { name: "Bruce" } ).upsert().replaceOne(
   {
     name: "Bruce",
     type: "Bat",
   }
);
bulk.execute();

Resultat:

 BulkWriteResult({
 "writeErrors" : [ ],
 "writeConcernErrors" : [ ],
 "nInserted" : 0,
 "nUpserted" : 1,
 "nMatched" : 0,
 "nModified" : 0,
 "nRemoved" : 0,
 "upserted" : [
 {
 "index" : 0,
 "_id" : ObjectId("5fe1c179d9914101694100dd")
 }
 ]
 }) 

Vi kan se, at et dokument blev slettet. Vi kan også se _id der blev genereret til det dokument.

Når vi nu ser dokumenterne i vores samling, kan vi se det nye dokument, der blev slettet:

db.pets.find()

Resultat:

 
 { "_id" : 1, "name" : "Wag", "type" : "Cow" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" }
 { "_id" : ObjectId("5fe1c179d9914101694100dd"), "name" : "Bruce", "type" : "Bat" } 


  1. Sådan bruger du MongoRegex (MongoDB C#-driver)

  2. hvordan man bruger aggregatfunktion i meteor

  3. zmq vs redis for pub-sub-mønster

  4. Opbygning af en maskinlæringsapplikation med Cloudera Data Science Workbench og operationel database, del 1:Opsætning og grundlæggende