I MongoDB kan du använda $push
operator för att lägga till ett värde till en array.
Du kan använda olika modifierare för att ange värdets position i arrayen, ordningen på elementen i arrayen, lägga till flera värden, etc.
Exempel
Anta att vi har en samling som heter products
med följande dokument:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hatt" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L" ] }Och låt oss säga att vi vill lägga till ett värde till arrayen i dokument 3.
Vi kan använda
$push
i kombination medupdate()
för att lägga till värdet:db.products.update( { _id: 3 }, { $push: { sizes: "XL" } } )
Utdata:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Låt oss titta på samlingen igen för att verifiera ändringen:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hatt" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L", "XL" ] }Infoga värdet på en viss position
Du kan använda
$each
och$position
modifierare för att ange var värdet ska infogas i arrayen.Till exempel kan vi använda värdet
0
för att infoga den i början av arrayen.Exempel:
db.products.update( { _id: 3 }, { $push: { sizes: { $each: [ "S" ], $position: 0 } } } )
Utdata:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
$each
modifieraren lägger till flera värden till matrisfältet. I det här fallet infogade vi bara ett värde i arrayen, dock för att använda$position
modifierare måste den visas med$each
modifierare.Låt oss kolla in samlingen igen:
db.products.find()
Resultat:
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hatt" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "S", "M", "L" , "XL" ] }Lägg till och sortera
Anta att vi har en samling med följande dokument:
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 15, 11, 8 ] }Och anta att vi vill lägga till några värden till matrisen i dokument 3, men vi vill också sortera matrisen i stigande ordning efter att vi har lagt till värdet.
Vi kan göra detta:
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 5, 12 ], $sort: 1 } } } )
Utdata:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })När vi nu tittar på samlingen kan vi se att det tredje dokumentet har ändrats i enlighet med detta.
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 5, 8, 11, 12, 15 ] }För att sortera den i fallande ordning, använd
$sort: -1
.Skär upp Arrayen
Du kan använda
$slice
modifierare för att begränsa antalet element i arrayen.Låt oss till exempel lägga till ett annat värde till arrayen, men sedan dela upp arrayen till ett visst antal element.
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $slice: 3 } } } )
Utdata:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Låt oss nu kontrollera 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 det här fallet var arrayen skivad, men värdet som vi lade till hamnade inte ens i den slutliga arrayen. Detta beror på att värdet lades till i arrayen och vi använde inte en
$sort
operation, och så förblev värdet i slutet av arrayen innan arrayen delades till sina första tre element.Här är den igen, förutom den här gången med
$sort
modifierare.db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $sort: 1, $slice: 3 } } } )
Utdata:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Kontrollera samlingen:
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 3, 5, 8 ] }Lägg till värde endast om det inte finns
Om du bara vill att värdet ska läggas till om det inte redan finns i arrayen, överväg att använda
$addToSet
operatör.