В MongoDB можете да използвате $push оператор за добавяне на стойност към масив.
Можете да използвате различни модификатори, за да посочите позицията на стойността в масива, реда на елементите в масива, да добавите множество стойности и т.н.
Пример
Да предположим, че имаме колекция, наречена products със следните документи:
db.products.find() Резултат:
{ "_id" :1, "продукт" :"Прилеп", "размери" :[ "S", "M", "L" ] }{ "_id" :2, "продукт" :"Шапка" , "размери" :[ "S", "L", "XL" ] }{ "_id" :3, "продукт" :"Капачка", "размери" :[ "M", "L" ] }предварително>
И да кажем, че искаме да добавим стойност към масива в документ 3.
Можем да използваме $push във връзка с update() за да добавите стойността:
db.products.update(
{ _id: 3 },
{ $push: { sizes: "XL" } }
)
Изход:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
Нека отново да разгледаме колекцията, за да проверим промяната:
db.products.find()
Резултат:
{ "_id" :1, "продукт" :"Прилеп", "размери" :[ "S", "M", "L" ] }{ "_id" :2, "продукт" :"Шапка" , "размери" :[ "S", "L", "XL" ] }{ "_id" :3, "продукт" :"Капачка", "размери" :[ "M", "L", "XL" ] } Вмъкнете стойността на определена позиция
Можете да използвате $each и $position модификатори, за да укажете къде стойността трябва да се вмъкне в масива.
Например, можем да използваме стойност от 0 за да го вмъкнете в началото на масива.
Пример:
db.products.update(
{ _id: 3 },
{
$push: {
sizes: {
$each: [ "S" ],
$position: 0
}
}
}
)
Изход:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
$each модификаторът добавя множество стойности към полето на масива. В този случай обаче вмъкнахме само една стойност в масива, за да използваме $position модификатор, той трябва да се появи с $each модификатор.
Нека проверим колекцията отново:
db.products.find()
Резултат:
{ "_id" :1, "продукт" :"Прилеп", "размери" :[ "S", "M", "L" ] }{ "_id" :2, "продукт" :"Шапка" , "размери" :[ "S", "L", "XL" ] }{ "_id" :3, "продукт" :"Капачка", "размери" :[ "S", "M", "L" , "XL" ] } Добавяне и сортиране
Да предположим, че имаме колекция със следните документи:
db.players.find()
Резултат:
{ "_id" :1, "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "резултати " :[ 15, 11, 8 ] }
И да предположим, че искаме да добавим някои стойности към масива в документ 3, но също така искаме да сортираме масива във възходящ ред, след като сме добавили стойността.
Можем да направим това:
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 5, 12 ],
$sort: 1
}
}
}
)
Изход:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
Сега, когато прегледаме колекцията, можем да видим, че третият документ е съответно променен.
db.players.find()
Резултат:
{ "_id" :1, "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "резултати " :[ 5, 8, 11, 12, 15 ] }
За да го сортирате в низходящ ред, използвайте $sort: -1 .
Нарежете масива
Можете да използвате $slice модификатор за ограничаване на броя на елементите в масива.
Например, нека добавим друга стойност към масива, но след това да нарежем масива на определен брой елементи.
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$slice: 3
}
}
}
)
Изход:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
Сега нека проверим колекцията отново:
db.players.find()
Резултат:
{ "_id" :1, "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "резултати " :[ 5, 8, 11 ] }
В този случай масивът беше нарязан, но стойността, която добавихме, дори не се оказа в крайния масив. Това е така, защото стойността беше добавена към масива и ние не използвахме $sort операция и така стойността остава в края на масива, преди масивът да бъде нарязан на първите му три елемента.
Ето го отново, освен този път с $sort модификатор.
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$sort: 1,
$slice: 3
}
}
}
)
Изход:
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })
Проверете колекцията:
db.players.find()
Резултат:
{ "_id" :1, "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "резултати " :[ 3, 5, 8 ] } Добавяне на стойност само ако тя не съществува
Ако искате стойността да бъде добавена само ако тя все още не съществува в масива, тогава помислете за използването на $addToSet оператор.