sql >> Database >  >> NoSQL >> MongoDB

MongoDB $push

In MongoDB kunt u de $push . gebruiken operator om een ​​waarde aan een array toe te voegen.

U kunt verschillende modifiers gebruiken om de positie van de waarde in de array, de volgorde van de elementen in de array te specificeren, meerdere waarden toe te voegen, enz.

Voorbeeld

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

db.products.find()

Resultaat:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }

En laten we zeggen dat we een waarde willen toevoegen aan de array in document 3.

We kunnen $push . gebruiken in combinatie met update() om de waarde toe te voegen:

db.products.update(
   { _id: 3 },
   { $push: { sizes: "XL" } }
)

Uitgang:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Laten we de collectie nogmaals bekijken om de wijziging te verifiëren:

db.products.find()

Resultaat:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L", "XL" ] }

Voer de waarde in op een bepaalde positie

U kunt de $each . gebruiken en $position modifiers om aan te geven waar de waarde in de array moet worden ingevoegd.

We kunnen bijvoorbeeld een waarde van 0 . gebruiken om het aan het begin van de array in te voegen.

Voorbeeld:

db.products.update(
   { _id: 3 },
   { 
     $push: { 
        sizes: {
           $each: [ "S" ],
           $position: 0
        }
      } 
    }
)

Uitgang:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

De $each modifier voegt meerdere waarden toe aan het arrayveld. In dit geval hebben we echter maar één waarde in de array ingevoegd om de $position . te gebruiken modifier, het moet verschijnen met de $each modificatie.

Laten we de collectie nog eens bekijken:

db.products.find()

Resultaat:

{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] }
{ "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }

Toevoegen en sorteren

Stel we hebben een collectie met de volgende documenten:

db.players.find()

Resultaat:

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

En stel dat we enkele waarden aan de array in document 3 willen toevoegen, maar we willen de array ook in oplopende volgorde sorteren nadat we de waarde hebben toegevoegd.

We kunnen dit:

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 5, 12 ],
           $sort: 1
        }
      } 
    }
)

Uitgang:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Als we nu de collectie bekijken, kunnen we zien dat het derde document dienovereenkomstig is aangepast.

db.players.find()

Resultaat:

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

Om het in aflopende volgorde te sorteren, gebruik je $sort: -1 .

Snijd de array

U kunt de $slice . gebruiken modifier om het aantal elementen in de array te beperken.

Laten we bijvoorbeeld een andere waarde aan de array toevoegen, maar dan de array opdelen in een bepaald aantal elementen.

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $slice: 3
        }
      } 
    }
)

Uitgang:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Laten we nu de collectie nog eens bekijken:

db.players.find()

Resultaat:

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

In dit geval is de array gesegmenteerd, maar de waarde die we hebben toegevoegd, is niet eens in de uiteindelijke array terechtgekomen. Dit komt omdat de waarde aan de array is toegevoegd en we geen $sort . hebben gebruikt bewerking, en dus bleef de waarde aan het einde van de array voordat de array in de eerste drie elementen werd gesegmenteerd.

Hier is het weer, behalve deze keer met de $sort modificatie.

db.players.update(
   { _id: 3 },
   { 
     $push: { 
        scores: {
           $each: [ 3 ],
           $sort: 1,
           $slice: 3
        }
      } 
    }
)

Uitgang:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Bekijk de collectie:

db.players.find()

Resultaat:

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

Voeg alleen waarde toe als deze niet bestaat

Als u wilt dat de waarde alleen wordt toegevoegd als deze nog niet in de array bestaat, kunt u overwegen de $addToSet te gebruiken exploitant.


  1. Waarom worden gegevens opgeslagen met rare sleutels in Redis bij gebruik van Jedis met Spring Data?

  2. GSSException:geen geldige referenties verstrekt (mechanismeniveau:kan geen Kerberos-tgt vinden)

  3. Het is niet mogelijk om een ​​mongodb-document te vergrendelen. Wat als ik dat nodig heb?

  4. Object uit geneste array verwijderen op basis van meerdere criteria