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

MongoDB opdatering()

I MongoDB er db.collection.update() metoden ændrer et eksisterende dokument eller dokumenter i en samling.

Som standard opdaterer den kun et enkelt dokument. Men hvis multi: true er angivet, så opdaterer den alle dokumenter, der matcher forespørgselskriterierne.

Opdater et enkelt dokument

Antag, at vi har samlingen kaldet pets med følgende dokumenter:

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

Vi kan opdatere et enkelt dokument som dette:

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

Resultat:

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

Kun ét dokument blev opdateret. Dette bekræftes, når vi forespørger på samlingen.

db.pets.find()

Resultat:

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

Opdater flere dokumenter

Lad os bruge de originale dokumenter igen:

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

Denne gang tilføjer vi multi: true til vores opdateringsoperation for at opdatere alle dokumenter, der matcher forespørgselskriterierne:

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

Resultat:

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

Så to dokumenter blev matchet og opdateret denne gang.

Lad os se på vores 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 forventet har begge dokumenter nu en type af Cow .

Ophæv

db.collection.update() metode accepterer en upsert argument, der sætter dig i stand til at udføre en upsert-operation.

Når upsert: true , opdateres dokumentet, hvis der er et match med filterkriterierne, men hvis der ikke er noget match, indsættes et nyt dokument.

Lad os starte med de originale dokumenter igen:

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

Eksempel:

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

Resultat:

 WriteResult({
 "nMatched" : 0,
 "nUpserted" : 1,
 "nModified" : 0,
 "_id" : ObjectId("5fe2c925d9914101694102e1")
 }) 

I dette tilfælde var der ingen resultater, så et dokument blev slettet.

Lad os tjekke samlingen.

db.pets.find()

Resultat:

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

Indlejrede dokumenter

Du kan også bruge db.collection.update() for at opdatere indlejrede dokumenter.

Antag, at vi har følgende dokument:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Vi kan bruge følgende kode til at opdatere det indlejrede dokument.

db.pets.update({ 
    _id: 1 
    }, { 
        $set: { 
            "specs.weight": 20, 
            "specs.color": "blue"
        } 
})

Resultat:

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

Så vi kan se, at ét dokument blev matchet og ændret.

Lad os tjekke dokumentet.

db.pets.find({
    _id: 1
    }).pretty()

Resultat:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 20,
		"color" : "blue"
	}
}

Vi kan se, at det indlejrede dokument blev opdateret som angivet.

Arrays

Lad os bruge db.collection.update() for at opdatere et array.

Antag, at vi har følgende dokument:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

Lad os opdatere to af array-elementerne og hundens navn.

db.pets.update({ 
    _id: 1 
    }, { 
        $set: { 
            "name": "Bark",
            "awards.0": "Bottom Dog", 
            "awards.1": "Worst Dog"
        } 
})

Resultat:

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

Vi kan se, at ét dokument blev matchet og ændret.

Og se nu på dokumentet.

db.pets.find().pretty()

Resultat:

{
	"_id" : 1,
	"name" : "Bark",
	"type" : "Dog",
	"awards" : [
		"Bottom Dog",
		"Worst Dog",
		"Biggest Dog"
	]
}

ArrayFilters-parameteren

Du kan også bruge arrayFilters parameter og den positionelle $ operatør for at bestemme, hvilke array-elementer der skal opdateres.

Antag for eksempel, at vi har en samling kaldet players med følgende dokumenter:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Vi kunne køre følgende forespørgsel for kun at opdatere de array-elementer, der har en værdi højere end et bestemt beløb (i dette tilfælde 10).

db.players.update(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   { arrayFilters: [ { "e": { $gte: 10 } } ] }
)

Resultat:

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

Som forventet opdaterer dette kun ét dokument, selvom to dokumenter matcher kriterierne (fordi vi ikke specificerede multi: true ).

Sådan ser dokumenterne ud nu.

db.players.find()

Resultat:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Dokument 2 havde to array-elementer opdateret, fordi disse elementer matchede kriterierne.

Flere oplysninger

db.collection.update() metode accepterer også andre parametre, såsom writeConcern , collation og hint .

Se MongoDB-dokumentationen for db.collections.update() for mere information.


  1. Redis og Node.js og Socket.io spørgsmål

  2. Få værdier med jedis pipeline

  3. Hvordan indsætter man et dokument i mongodb ved hjælp af mongoose og får det genererede id?

  4. Få $elemMatch (projektion) til at returnere alle objekter, der matcher kriterier