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.