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 med update() 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.