MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment trier un tableau dans une collection

En supposant que les éléments de vos products sont uniques, il n'y a pas de prise en charge facile côté serveur pour maintenir ce tableau dans un ordre trié comme dans MongoDB 2.4. Votre meilleure option étant donné les tableaux imbriqués sera de trier les tableaux dans la logique de votre application comme il convient (c'est-à-dire lors de l'insertion/mise à jour ou lors de la récupération/affichage).

Considérations sur la modélisation des données

Si vous devez effectuer de nombreuses manipulations d'entrées de tableau imbriquées, vous devriez envisager d'aplatir votre modèle de données pour en faciliter l'utilisation. Votre objectif de conception avec MongoDB doit être d'avoir un modèle de données adapté aux cas d'utilisation de votre application avec un équilibre de performances acceptable entre la facilité d'insertion/de mise à jour/d'interrogation. Vous n'êtes certainement pas obligé de tout modéliser dans une seule collection/requête si cela n'a pas de sens, et vous devez être prêt à dénormaliser (dupliquer) les données. Pour les relations plusieurs-à-plusieurs telles que produits <=> catégories, il est courant d'intégrer et de dénormaliser l'entité la moins fréquemment mise à jour (par exemple, l'intégration de catégories dans les produits).

Tableaux persistants triés et plafonnés (éléments non uniques)

Si vous souhaitez conserver les tableaux dans l'ordre trié et les éléments ne sont pas uniques, MongoDB 2.4 a la possibilité de $push à un tableau trié, mais cela doit être utilisé en conjonction avec une tranche (limite de tableau). Si vous $push des entrées identiques à un tableau trié, vous vous retrouverez avec des doublons (ce n'est donc probablement pas ce que vous recherchez).

Exemple de mise à jour, en supposant page dans votre exemple était le nom de la collection :

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