Uitgaande van de items in uw products
array uniek zijn, is er geen eenvoudige server-side ondersteuning voor het onderhouden van deze array in gesorteerde volgorde zoals bij MongoDB 2.4. Gezien de geneste arrays is de beste optie om de arrays in uw toepassingslogica naar behoren te sorteren (d.w.z. bij invoegen/bijwerken of ophalen/weergeven).
Overwegingen bij gegevensmodellering
Als u veel manipulatie van geneste array-items moet doen, moet u overwegen uw gegevensmodel af te vlakken om het gemakkelijker te maken om mee te werken. Uw ontwerpdoel met MongoDB zou moeten zijn om een gegevensmodel te hebben dat geschikt is voor uw toepassingsscenario's met een acceptabel prestatieevenwicht tussen eenvoudig invoegen/bijwerken/opvragen. Je hoeft zeker niet alles in één collectie/query te modelleren als het geen zin heeft om dat te doen, en je moet bereid zijn om data te denormaliseren (dupliceren). Voor veel-op-veel-relaties zoals producten <=> categorieën is het gebruikelijk om de entiteit die minder vaak wordt bijgewerkt, in te sluiten en te denormaliseren (bijvoorbeeld het insluiten van categorieën in producten).
Aanhoudende gesorteerde, afgedekte arrays (niet-unieke items)
Als u arrays in gesorteerde volgorde wilt bewaren en de items zijn niet uniek, MongoDB 2.4 heeft wel de optie om $push
naar een gesorteerde array, maar dit moet worden gebruikt in combinatie met een slice (arraylimiet). Als je $push
identieke items aan een gesorteerde array, je krijgt duplicaten (dus dit is waarschijnlijk niet wat je zoekt).
Voorbeeldupdate, uitgaande van page
in jouw voorbeeld was de collectienaam:
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
}
}}
)