Za předpokladu, že položky ve vašich products
pole jsou jedinečné, neexistuje snadná podpora na straně serveru pro udržování tohoto pole v seřazeném pořadí jako v MongoDB 2.4. Nejlepší možností vzhledem k vnořeným polím bude seřadit pole podle potřeby ve vaší aplikační logice (tj. při vložení/aktualizaci nebo při načítání/zobrazení).
Úvahy o datovém modelování
Pokud potřebujete hodně manipulovat s položkami vnořených polí, měli byste zvážit zploštění datového modelu, aby se s ním snadněji pracovalo. Vaším cílem návrhu s MongoDB by mělo být mít datový model, který je vhodný pro případy použití vaší aplikace s přijatelnou výkonnostní rovnováhou mezi snadným vkládáním/aktualizací/dotazováním. Rozhodně nemusíte modelovat vše v jedné kolekci/dotazu, pokud to nedává smysl, a měli byste být připraveni denormalizovat (duplikovat) data. Pro vztah mnoho k mnoha, jako jsou kategorie produktů <=>, je typické vložit a denormalizovat entitu, která je méně často aktualizována (například vkládání kategorií do produktů).
Trvalá seřazená, omezená pole (neunikátní položky)
Pokud chcete zachovat pole v seřazeném pořadí a položky nejsou jedinečné, MongoDB 2.4 má možnost $push
do setříděného pole, ale to musí být použito ve spojení s řezem (limit pole). Pokud $push
identické položky s setříděným polem, skončíte s duplikáty (takže to pravděpodobně není to, co hledáte).
Ukázková aktualizace za předpokladu page
ve vašem příkladu byl název kolekce:
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
}
}}
)