I MongoDB, när du uppdaterar dokument som innehåller arrayer, har du möjlighet att använda arrayFilters
parameter.
arrayFilters
parametern låter dig ange en array av filterdokument som bestämmer vilka arrayelement som ska ändras.
I uppdateringsdokumentet använder du $[<identifier>]
filtrerad positionsoperator, som identifierar arrayelementen som matchar arrayFilters
villkor för uppdateringen.
Syntax
Syntaxen ser ut så här:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Så till exempel när den används med updateMany()
metod går det så här:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Exempel
Anta att vi har en samling som heter players
med följande dokument:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Vi skulle kunna använda arrayFilters
parameter för att endast uppdatera de arrayelement som har ett värde som är högre än ett visst belopp.
Exempel:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Meddelandet berättar att tre dokument matchades och modifierades.
Så här ser dokumenten ut nu.
db.players.find()
Resultat:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Vi kan se att alla värden som tidigare var större än eller lika med 10 nu är 10.
I det här fallet använde jag e
som <identifier>
. Observera att <identifier>
måste börja med en liten bokstav och endast innehålla alfanumeriska tecken.