sql >> Database >  >> NoSQL >> MongoDB

MongoDB updateOne()

In MongoDB de db.collection.updateOne() methode werkt een enkel document binnen de collectie bij op basis van het filter.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets die de volgende documenten bevat:

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

We kunnen één document als volgt bijwerken:

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

Resultaat:

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

Dat heeft slechts één document bijgewerkt, ook al voldoen twee documenten aan de filtercriteria (de criteria zijn type: "Dog" ).

We kunnen de resultaten als volgt controleren:

db.pets.find()

Resultaat:

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

Het eerste document heeft nu een type van Cow in plaats van Dog , maar het tweede document werd niet beïnvloed, ook al voldeed het ook aan de filtercriteria.

Upsert

De db.collection.updateOne() methode accepteert een upsert argument waarmee u een upsert-bewerking kunt uitvoeren.

Wanneer upsert: true , het document wordt bijgewerkt als er een overeenkomst is met de filtercriteria, maar als er geen overeenkomst is, wordt een nieuw document ingevoegd.

Laten we opnieuw beginnen met de originele documenten:

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

Voorbeeld:

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

Resultaat:

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

In dit geval waren er geen overeenkomsten, dus een document werd geüpdatet.

Laten we de collectie eens bekijken.

db.pets.find()

Resultaat:

 { "_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" } 

Ingesloten documenten

U kunt ook db.collection.updateOne() . gebruiken om ingesloten documenten bij te werken.

Stel dat we het volgende document hebben:

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

We kunnen de volgende code gebruiken om het ingesloten document bij te werken.

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

Resultaat:

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

We kunnen dus zien dat één document is bijgewerkt.

Laten we het document controleren.

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

Resultaat:

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

We kunnen zien dat het ingesloten document is bijgewerkt zoals gespecificeerd.

Arrays

Laten we db.collection.updateOne() . gebruiken om een ​​array bij te werken.

Stel dat we het volgende document hebben:

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

Laten we twee van de array-elementen en de naam van de hond bijwerken.

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

Resultaat:

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

We kunnen zien dat één document is bijgewerkt.

En laten we het document eens bekijken.

db.pets.find().pretty()

Resultaat:

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

De arrayFilters Parameter

U kunt ook de arrayFilters . gebruiken parameter en de positionele $ operator om te bepalen welke array-elementen moeten worden bijgewerkt.

Stel dat we bijvoorbeeld een verzameling hebben met de naam players met de volgende documenten:

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

We zouden de volgende query kunnen uitvoeren om alleen die array-elementen bij te werken die een waarde hebben die hoger is dan een bepaald aantal (in dit geval 10).

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

Resultaat:

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

Zoals verwacht, werkt dit slechts één document bij, ook al voldoen twee documenten aan de criteria.

Zo zien de documenten er nu uit.

db.players.find()

Resultaat:

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

Document 2 had twee array-elementen bijgewerkt, omdat die elementen aan de criteria voldeden.

Meer informatie

De db.collection.updateOne() methode accepteert ook andere parameters, zoals writeConcern , collation , en hint .

Zie de MongoDB-documentatie voor db.collections.updateOne() voor meer informatie.


  1. MongoDB voor elk()

  2. Redis Cheatsheet voor geheugenoptimalisatie

  3. MongoDB aggregaat vullen ontbrekende dagen

  4. python-rq worker sluit automatisch