I MongoDB kan du bruge $push
operator for at tilføje en værdi til en matrix.
Du kan bruge forskellige modifikatorer til at angive værdiens position i arrayet, rækkefølgen af elementerne i arrayet, tilføje flere værdier osv.
Eksempel
Antag, at vi har en samling kaldet products
med følgende dokumenter:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Flagermus", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hat" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L" ] }Og lad os sige, at vi ønsker at tilføje en værdi til arrayet i dokument 3.
Vi kan bruge
$push
i forbindelse medupdate()
for at tilføje værdien:db.products.update( { _id: 3 }, { $push: { sizes: "XL" } } )
Output:
SkrivResultat({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Lad os se på samlingen igen for at bekræfte ændringen:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Flagermus", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hat" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L", "XL" ] }Indsæt værdien på en bestemt position
Du kan bruge
$each
og$position
modifikatorer for at angive, hvor værdien skal indsættes i arrayet.For eksempel kan vi bruge en værdi på
0
for at indsætte det i starten af arrayet.Eksempel:
db.products.update( { _id: 3 }, { $push: { sizes: { $each: [ "S" ], $position: 0 } } } )
Output:
SkrivResultat({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
$each
modifier tilføjer flere værdier til matrixfeltet. I dette tilfælde indsatte vi kun én værdi i arrayet, men for at bruge$position
modifikator, skal den vises med$each
modifikator.Lad os tjekke samlingen igen:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Flagermus", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hat" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "S", "M", "L" , "XL" ] }Tilføj og sorter
Antag, at vi har en samling med følgende dokumenter:
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 15, 11, 8 ] }Og antag, at vi vil tilføje nogle værdier til arrayet i dokument 3, men vi vil også sortere arrayet i stigende rækkefølge, efter at vi har tilføjet værdien.
Vi kan gøre dette:
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 5, 12 ], $sort: 1 } } } )
Output:
SkrivResultat({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Når vi nu ser samlingen, kan vi se, at det tredje dokument er blevet ændret i overensstemmelse hermed.
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 5, 8, 11, 12, 15 ] }For at sortere det i faldende rækkefølge, brug
$sort: -1
.Skær arrayet i skiver
Du kan bruge
$slice
modifikator for at begrænse antallet af elementer i arrayet.Lad os f.eks. tilføje en anden værdi til arrayet, men derefter opdele arrayet til et bestemt antal elementer.
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $slice: 3 } } } )
Output:
SkrivResultat({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Lad os nu tjekke samlingen igen:
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 5, 8, 11 ] }I dette tilfælde blev arrayet skåret i skiver, men den værdi, som vi tilføjede, endte ikke engang i det endelige array. Dette skyldes, at værdien blev tilføjet til arrayet, og vi brugte ikke en
$sort
operation, og værdien forblev således i slutningen af arrayet, før arrayet blev skåret til dets første tre elementer.Her er den igen, bortset fra denne gang med
$sort
modifikator.db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $sort: 1, $slice: 3 } } } )
Output:
SkrivResultat({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Tjek samlingen:
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 3, 5, 8 ] }Tilføj kun værdi, hvis den ikke eksisterer
Hvis du kun ønsker, at værdien skal tilføjes, hvis den ikke allerede findes i arrayet, så overvej at bruge
$addToSet
operatør.