MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come ordinare un array in una raccolta

Assumendo gli articoli nei tuoi products array sono unici, non c'è alcun supporto lato server facile per mantenere questo array in ordine come in MongoDB 2.4. L'opzione migliore, dati gli array nidificati, sarà quella di ordinare gli array nella logica dell'applicazione in modo appropriato (ad esempio all'inserimento/aggiornamento o al recupero/visualizzazione).

Considerazioni sulla modellazione dei dati

Se devi manipolare molte voci di array nidificati, dovresti considerare di appiattire il tuo modello di dati per semplificare il lavoro. Il tuo obiettivo di progettazione con MongoDB dovrebbe essere quello di avere un modello di dati appropriato per i casi d'uso delle tue applicazioni con un equilibrio di prestazioni accettabile tra facilità di inserimento/aggiornamento/interrogazione. Sicuramente non è necessario modellare tutto in una singola raccolta/query se non ha senso farlo e dovresti essere pronto a denormalizzare (duplicare) i dati. Per le relazioni molti-a-molti come le categorie di prodotti <=> è tipico incorporare e denormalizzare qualsiasi entità viene aggiornata meno frequentemente (ad esempio, incorporare categorie nei prodotti).

Matrici ordinate persistenti con limite (elementi non univoci)

Se vuoi rendere persistenti gli array in ordine e gli elementi non sono univoci, MongoDB 2.4 ha la possibilità di $push a un array ordinato, ma questo deve essere utilizzato insieme a una slice (limite di array). Se $push voci identiche a un array ordinato ti ritroverai con dei duplicati (quindi probabilmente non è quello che stai cercando).

Esempio di aggiornamento, presupponendo page nel tuo esempio c'era il nome della collezione:

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
        }
    }}
)