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

MongoDB $ push

In MongoDB, puoi usare $push per aggiungere un valore a una matrice.

Puoi utilizzare vari modificatori per specificare la posizione del valore nell'array, l'ordine degli elementi nell'array, aggiungere più valori, ecc.

Esempio

Supponiamo di avere una collezione chiamata products con i seguenti documenti:

db.products.find()

Risultato:

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

E supponiamo di voler aggiungere un valore all'array nel documento 3.

Possiamo usare $push insieme a update() per aggiungere il valore:

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

Uscita:

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

Esaminiamo nuovamente la collezione per verificare la modifica:

db.products.find()

Risultato:

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

Inserisci il valore in una determinata posizione

Puoi usare il $each e $position modificatori per specificare dove inserire il valore nell'array.

Ad esempio, possiamo utilizzare un valore di 0 per inserirlo all'inizio dell'array.

Esempio:

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

Uscita:

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

Il $each modificatore aggiunge più valori al campo della matrice. In questo caso, tuttavia, abbiamo inserito un solo valore nell'array per utilizzare il $position modificatore, deve apparire con il $each modificatore.

Controlliamo di nuovo la collezione:

db.products.find()

Risultato:

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

Aggiungi e ordina

Supponiamo di avere una collezione con i seguenti documenti:

db.players.find()

Risultato:

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

E supponiamo di voler aggiungere alcuni valori all'array nel documento 3, ma di voler anche ordinare l'array in ordine crescente dopo aver aggiunto il valore.

Possiamo farlo:

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

Uscita:

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

Ora, quando vediamo la collezione, possiamo vedere che il terzo documento è stato modificato di conseguenza.

db.players.find()

Risultato:

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

Per ordinarlo in ordine decrescente, usa $sort: -1 .

Taglia l'array

Puoi usare il $slice modificatore per limitare il numero di elementi nell'array.

Ad esempio, aggiungiamo un altro valore all'array, ma poi suddividiamo l'array in un certo numero di elementi.

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

Uscita:

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

Ora controlliamo di nuovo la collezione:

db.players.find()

Risultato:

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

In questo caso, l'array è stato tagliato, ma il valore che abbiamo aggiunto non è nemmeno finito nell'array finale. Questo perché il valore è stato aggiunto all'array e non abbiamo usato un $sort operazione, e quindi il valore è rimasto alla fine dell'array prima che l'array fosse suddiviso nei suoi primi tre elementi.

Eccolo di nuovo, tranne questa volta con il $sort modificatore.

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

Uscita:

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

Controlla la collezione:

db.players.find()

Risultato:

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

Aggiungi valore solo se non esiste

Se vuoi che il valore venga aggiunto solo se non esiste già nell'array, considera l'utilizzo di $addToSet operatore.