W MongoDB możesz użyć $push
operatora, aby dodać wartość do tablicy.
Możesz użyć różnych modyfikatorów, aby określić pozycję wartości w tablicy, kolejność elementów w tablicy, dodać wiele wartości itp.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującymi dokumentami:
db.products.find()
Wynik:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
I powiedzmy, że chcemy dodać wartość do tablicy w dokumencie 3.
Możemy użyć $push
w połączeniu z update()
aby dołączyć wartość:
db.products.update(
{ _id: 3 },
{ $push: { sizes: "XL" } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Spójrzmy ponownie na kolekcję, aby zweryfikować zmianę:
db.products.find()
Wynik:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L", "XL" ] }
Wstaw wartość w określonej pozycji
Możesz użyć $each
i $position
modyfikatory określające, gdzie wartość powinna być wstawiona do tablicy.
Na przykład możemy użyć wartości 0
aby wstawić go na początku tablicy.
Przykład:
db.products.update(
{ _id: 3 },
{
$push: {
sizes: {
$each: [ "S" ],
$position: 0
}
}
}
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$each
modyfikator dołącza wiele wartości do pola tablicy. W tym przypadku jednak wstawiliśmy tylko jedną wartość do tablicy, aby użyć $position
modyfikator, musi pojawić się z $each
modyfikator.
Sprawdźmy jeszcze raz kolekcję:
db.products.find()
Wynik:
{ "_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" ] }
Dołącz i sortuj
Załóżmy, że mamy kolekcję z następującymi dokumentami:
db.players.find()
Wynik:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
I załóżmy, że chcemy dołączyć jakieś wartości do tablicy w dokumencie 3, ale chcemy również posortować tablicę w porządku rosnącym po dodaniu wartości.
Możemy to zrobić:
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 5, 12 ],
$sort: 1
}
}
}
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Teraz, gdy przeglądamy kolekcję, widzimy, że trzeci dokument został odpowiednio zmodyfikowany.
db.players.find()
Wynik:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 5, 8, 11, 12, 15 ] }
Aby posortować je w kolejności malejącej, użyj $sort: -1
.
Pokrój tablicę
Możesz użyć $slice
modyfikator, aby ograniczyć liczbę elementów w tablicy.
Na przykład dodajmy kolejną wartość do tablicy, a następnie podzielmy tablicę na określoną liczbę elementów.
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$slice: 3
}
}
}
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Teraz ponownie sprawdźmy kolekcję:
db.players.find()
Wynik:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 5, 8, 11 ] }
W tym przypadku tablica została podzielona, ale dodana przez nas wartość nie znalazła się nawet w końcowej tablicy. Dzieje się tak, ponieważ wartość została dołączona do tablicy i nie użyliśmy $sort
operacji, więc wartość pozostała na końcu tablicy, zanim tablica została podzielona na pierwsze trzy elementy.
I znowu, tyle że tym razem z $sort
modyfikator.
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$sort: 1,
$slice: 3
}
}
}
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Sprawdź kolekcję:
db.players.find()
Wynik:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 8 ] }
Dołącz wartość tylko wtedy, gdy nie istnieje
Jeśli chcesz, aby wartość została dołączona tylko wtedy, gdy jeszcze nie istnieje w tablicy, rozważ użycie $addToSet
operator.