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

MongoDB updateMany()

I MongoDB er db.collection.updateMany() metode opdaterer alle dokumenter, der matcher det angivne filter for en samling.

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 se, at to dokumenter har Dog som deres type .

Vi kan opdatere begge dokumenter på én gang sådan her:

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

Resultat:

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

Dette viser os, at to dokumenter matchede, og to blev opdateret.

Vi kan tjekke samlingen:

db.pets.find()

Resultat:

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

Ophæv

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

Når upsert: true , alle dokumenter, der matcher filterkriterierne, opdateres, men hvis der ikke er nogen 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.updateMany( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Resultat:

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

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

Indlejrede dokumenter

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

Antag, at vi indsætter følgende dokumenter:

db.pets.insertMany([
    {
        "_id" : 1,
        "name" : "Wag",
        "type" : "Dog",
        "specs" : {
            "height" : 400,
            "weight" : 15,
            "color" : "white"
        }
    },  
    {
        "_id" : 2,
        "name" : "Bark",
        "type" : "Dog",
        "specs" : {
            "height" : 200,
            "weight" : 12,
            "color" : "white"
        }
    }
])

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

db.pets.updateMany({ 
    type: "Dog" 
    }, { 
        $set: { 
            "specs.color": "brown",
            "specs.gooddog": false
        } 
})

Resultat:

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

Så vi kan se, at begge dokumenter blev opdateret.

Lad os tjekke dokumentet.

db.pets.find({
    type: "Dog"
    }).pretty()

Resultat:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown",
		"gooddog" : false
	}
}
{
	"_id" : 2,
	"name" : "Bark",
	"type" : "Dog",
	"specs" : {
		"height" : 200,
		"weight" : 12,
		"color" : "brown",
		"gooddog" : false
	}
}

Vi kan se, at de indlejrede dokumenter blev opdateret som specificeret.

Arrays

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

Antag, 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 ] } 

Lad os opdatere to array-elementer i alle dokumenter.

db.players.updateMany({}, 
{ 
        $set: {
            "scores.0": 20, 
            "scores.1": 26
        } 
})

Resultat:

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

Vi kan se, at alle tre dokumenter blev opdateret. Dette skyldes, at jeg efterlod filterkriterierne tomme (jeg brugte {} for filterkriterierne).

Og lad os se på dokumentet.

db.players.find()

Resultat:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

ArrayFilters-parameteren

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

For eksempel ved at se på vores tidligere dokument:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

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

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

Resultat:

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

Som forventet matcher alle dokumenter kriterierne og er derfor opdateret. Ikke alle array-elementer blev dog opdateret.

Sådan ser dokumenterne ud nu.

db.players.find()

Resultat:

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

De eneste array-elementer, der blev opdateret, var dem med en værdi over 15.

Flere oplysninger

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

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


  1. Sådan får du flere listeværdier i et enkelt opkald i RedisTemplate af Jedis Client

  2. 'Det lykkedes ikke at fjerne linket til socketfilen i MongoDB 3.0

  3. Tilslutning til MongoDB-databaser

  4. Start redis-server med konfigurationsfil