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

MongoDB updateOne()

I MongoDB er db.collection.updateOne() metoden opdaterer et enkelt dokument i samlingen baseret på filteret.

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 kan opdatere ét dokument som dette:

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

Resultat:

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

Det opdaterede kun ét dokument, selvom to dokumenter matcher filterkriterierne (kriteriet er type: "Dog" ).

Vi kan tjekke resultaterne sådan her:

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 i stedet for Dog , men det andet dokument var upåvirket, selvom det også matchede filtreringskriterierne.

Ophæv

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

Når upsert: true , dokumentet opdateres, 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.updateOne( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Resultat:

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

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("5fe1e94dd991410169410199"), "name" : "Bubbles", "type" : "Fish" } 

Indlejrede dokumenter

Du kan også bruge db.collection.updateOne() 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.updateOne({ 
    _id: 1 
    }, { 
        $set: { 
            "specs.weight": 20, 
            "specs.color": "blue"
        } 
})

Resultat:

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

Så vi kan se, at ét dokument blev opdateret.

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.updateOne() 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.updateOne({ 
    _id: 1 
    }, { 
        $set: { 
            "name": "Bark",
            "awards.0": "Bottom Dog", 
            "awards.1": "Worst Dog"
        } 
})

Resultat:

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

Vi kan se, at et dokument blev opdateret.

Og lad os se på dokumentet.

db.pets.find().pretty()

Resultat:

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

arrayFilters Parameter

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.updateOne(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   { arrayFilters: [ { "e": { $gte: 10 } } ] }
)

Resultat:

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

Som forventet opdaterer dette kun ét dokument, selvom to dokumenter matcher kriterierne.

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.updateOne() metode accepterer også andre parametre, såsom writeConcern , collation og hint .

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


  1. Sådan annullerer du et job i kø i Laravel eller Redis

  2. MongoDB kan ikke finde databibliotek efter opgradering til Mac OS 10.15 (Catalina)

  3. Konfigurer logning for MongoDB Java-driveren

  4. gemmer tidsserier i redis