Zakładając pozycje w Twoich products
tablice są unikalne, nie ma łatwego wsparcia po stronie serwera dla utrzymania tej tablicy w porządku posortowanym jak w MongoDB 2.4. Najlepszą opcją, biorąc pod uwagę zagnieżdżone tablice, będzie odpowiednie sortowanie tablic w logice aplikacji (tj. przy wstawianiu/aktualizowaniu lub przy pobieraniu/wyświetlaniu).
Zagadnienia dotyczące modelowania danych
Jeśli potrzebujesz dużo manipulować zagnieżdżonymi wpisami tablicy, powinieneś rozważyć spłaszczenie modelu danych, aby ułatwić pracę. Twoim celem projektowym z MongoDB powinno być posiadanie modelu danych, który jest odpowiedni dla przypadków użycia aplikacji z akceptowalną równowagą wydajności między łatwością wstawiania/aktualizowania/zapytania. Zdecydowanie nie musisz modelować wszystkiego w jednej kolekcji/zapytaniu, jeśli nie ma to sensu, i powinieneś być przygotowany na denormalizację (zduplikowanie) danych. W przypadku relacji wiele-do-wielu, takich jak kategorie produktów <=>, typowe jest osadzanie i denormalizowanie tego, który element jest rzadziej aktualizowany (na przykład osadzanie kategorii w produktach).
Utrzymujące się posortowane, ograniczone tablice (nieunikalne elementy)
Jeśli chcesz zachować tablice w kolejności posortowanej i elementy nie są unikalne, MongoDB 2.4 ma opcję $push
do posortowanej tablicy, ale musi to być używane w połączeniu z wycinkiem (limit tablicy). Jeśli $push
identyczne wpisy do posortowanej tablicy, otrzymasz duplikaty (więc prawdopodobnie nie o to ci chodzi).
Przykładowa aktualizacja, zakładając page
w twoim przykładzie była nazwa kolekcji:
db.page.update(
// Query
{ "_id": "56rgt46rt54h68rt4h6" },
// Update sorted array
// NB: referring by array index position 0, as there isn't a named reference
{ $push : {
"categories.0.products" : {
// List of new elements to push
$each : [
{ "name" : "E", "pos": 3 }
],
// Sort by pos (ascending)
$sort : { "pos" : 1 },
// Maximum number of array elements (required for $sort)
$slice : -100
}
}}
)