sql >> Databasteknik >  >> NoSQL >> MongoDB

4 sätt att uppdatera ett dokument i MongoDB

MongoDB tillhandahåller olika sätt att uppdatera ett dokument. Metoden du använder beror på exakt hur du vill utföra uppdateringen.

Den här artikeln presenterar fyra sätt att uppdatera ett dokument i MongoDB.

db.collection.updateOne() Metod

db.collection.updateOne() metoden gör precis som namnet lovar – den uppdaterar ett dokument.

Anta att vi har en samling som heter pets som innehåller följande dokument:

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

Vi skulle kunna uppdatera ett dokument så här:

db.pets.updateOne( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Resultat:

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

Det uppdaterade bara ett dokument, även om två dokument matchar filterkriterierna (kriteriet är type: "Dog" ).

Vi kan kontrollera resultaten så här:

db.pets.find()

Resultat:

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

Det första dokumentet har nu en type av Cow istället för Dog , men det andra dokumentet påverkades inte, även om det också matchade filtreringskriterierna.

Den db.collection.updateMany() Metod

db.collection.updateMany() metod uppdaterar alla dokument som matchar det angivna filtret för en samling.

Låt oss använda de ursprungliga insamlingsdokumenten:

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

Återigen kan vi se att två dokument har Dog som deras type .

Vi kan uppdatera båda dokumenten samtidigt så här:

db.pets.updateMany( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Resultat:

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

Detta visar oss att två dokument matchade och två uppdaterades.

Vi kan kontrollera samlingen:

db.pets.find()

Resultat:

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

db.collection.update() Metod

db.collection.update() metod kan uppdatera ett enda dokument eller flera dokument i en samling.

Som standard uppdaterar den bara ett enda dokument. Men om multi: true anges, uppdaterar den alla dokument som matchar frågekriterierna.

Uppdatera ett enda dokument

Låt oss använda originalsamlingen av dokument igen:

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

Vi skulle kunna uppdatera ett dokument så här:

db.pets.update( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Resultat:

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

Endast ett dokument uppdaterades. Detta bekräftas när vi frågar samlingen.

db.pets.find()

Resultat:

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

Uppdatera flera dokument

Låt oss gå tillbaka till den ursprungliga samlingen av dokument igen:

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

Och nu lägger vi till multi: true till vår uppdateringsoperation för att uppdatera alla dokument som matchar frågekriterierna:

db.pets.update( 
    { type: "Dog" },
    { $set: { type: "Cow" } },
    { multi: true }
    )

Resultat:

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

Så två dokument matchades och uppdaterades denna gång.

Låt oss titta på vår samling igen:

db.pets.find()

Resultat:

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

Som förväntat har båda dokumenten nu en type av Cow .

db.collection.replaceOne() Metod

db.collection.replaceOne() metod ersätter ett enda dokument inom samlingen baserat på filtret.

Återigen med den ursprungliga samlingen:

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

Låt oss se vad som händer när vi använder db.collection.replaceOne() metod mot det.

db.pets.replaceOne( 
    { type: "Dog" },
    { type: "Cow" }
    )

Resultat:

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

Ett dokument har uppdaterats.

Låt oss ta en titt.

db.pets.find()

Resultat:

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

Den här gången ersattes hela dokumentet med det nya dokumentet (förutom _id fält).

Denna metod ersätter hela dokumentet (förutom _id). fält).

Upsert

Alla ovanstående metoder accepterar en upsert argument som gör att du kan utföra en upsert-operation.

När upsert: true , dokumentet uppdateras om det finns en matchning med frågekriterierna, men om det inte finns någon matchning infogas ett nytt dokument.

Exempel:

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

Resultat:

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

I det här fallet fanns det inga matchningar, så ett dokument rubbades.

Låt oss kolla in samlingen.

db.pets.find()

Resultat:

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

  1. Förstå MongoDB-säkerhetskopieringsalternativ

  2. Något som en tagg-cache och frågar efter den för att föreslå dem att använda Redis

  3. Behöver jag stänga en mongoose-anslutning manuellt?

  4. MongoCollection kontra DBCollection java