sql >> Database >  >> NoSQL >> MongoDB

Hoe de arrayFilters-parameter werkt in MongoDB

Wanneer u in MongoDB documenten bijwerkt die arrays bevatten, heeft u de mogelijkheid om de arrayFilters te gebruiken parameter.

De arrayFilters parameter stelt u in staat een array van filterdocumenten op te geven die bepalen welke array-elementen moeten worden gewijzigd.

Gebruik in het updatedocument de $[<identifier>] gefilterde positionele operator, die de array-elementen identificeert die overeenkomen met de arrayFilters voorwaarden voor de update-bewerking.

Syntaxis

De syntaxis gaat als volgt:

{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }

Dus bijvoorbeeld, wanneer gebruikt met de updateMany() methode gaat het als volgt:

db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[<identifier>]" : value } },
   { arrayFilters: [ { <identifier>: <condition> } ] }
)

Voorbeeld

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

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

We zouden de arrayFilters . kunnen gebruiken parameter om alleen die array-elementen bij te werken die een waarde hebben die hoger is dan een bepaald aantal.

Voorbeeld:

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

Resultaat:

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

Het bericht vertelt ons dat drie documenten zijn gematcht en aangepast.

Zo zien de documenten er nu uit.

db.players.find()

Resultaat:

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

We kunnen zien dat alle waarden die voorheen groter dan of gelijk waren aan 10 nu 10 zijn.

In dit geval gebruikte ik e als de <identifier> . Merk op dat de <identifier> moet beginnen met een kleine letter en mag alleen alfanumerieke tekens bevatten.


  1. Wat is een Map Only-baan in Hadoop?

  2. De PHP 7 MongoDB Client/Driver installeren?

  3. Spring Data MongoDB - Annotatie @CreatedDate werkt niet bij gebruik met aangepast Id-veld

  4. resque-scheduler mislukt bij het verwijderen van de taak