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

tri des sous-documents mangouste

J'aurais pu écrire cela en quelques mots, mais en considération, "récupérer les objets mangoustes" semble être la principale considération.

Il y a donc différentes choses que vous "pourriez" faire. Mais puisque vous "remplissez des références" dans un objet et que vous souhaitez ensuite modifier l'ordre des objets dans un tableau, il n'y a vraiment qu'une seule façon de résoudre ce problème une fois pour toutes.

Corrigez les données dans l'ordre au fur et à mesure que vous les créez

Si vous voulez que votre tableau "commentaires" soit trié par date à laquelle il est "created_at", cela se décompose même en plusieurs possibilités :

  1. Il "aurait dû" avoir été ajouté dans l'ordre "d'insertion", donc le "dernier" est le dernier comme vous le notez, mais vous pouvez également "modifier" cela dans les versions récentes (depuis quelques années maintenant) de MongoDB avec $position comme modificateur de $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { "comments": { "$each": [newComment], "$position": 0 } }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Cela "ajoute" l'élément de tableau au tableau existant au "premier" (0) index afin qu'il soit toujours au premier plan.

  2. À défaut d'utiliser des mises à jour "positionnelles" pour des raisons logiques ou simplement là où vous "voulez être sûr", alors il existe depuis encore "plus longtemps" le $sort modificateur de $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { 
                "comments": { 
                    "$each": [newComment], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Et cela va "trier" sur la propriété des documents des éléments du tableau qui contient la valeur spécifiée à chaque modification. Vous pouvez même faire :

    Article.update(
        {  },
        { 
            "$push": { 
                "comments": { 
                    "$each": [], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        { "multi": true },
        function(err,result) {
            // other work in here
        }
    );
    

    Et cela triera chaque tableau "commentaires" dans toute votre collection par le champ spécifié en un seul coup.

D'autres solutions sont possibles en utilisant soit .aggregate() pour trier le tableau et/ou "re-caster" en objets mangouste après avoir fait cette opération ou après avoir fait votre propre .sort() sur l'objet ordinaire.

Ces deux éléments impliquent réellement la création d'un objet modèle et d'un "schéma" séparés avec les éléments intégrés, y compris les informations "référencées". Vous pouvez donc travailler sur ces lignes, mais cela semble être une surcharge inutile lorsque vous pouvez simplement trier les données selon vos moyens "les plus nécessaires".

L'alternative est de s'assurer que les champs comme "virtuels" "sérialisent" toujours dans un format d'objet avec .toObject() sur appel et vivez simplement avec le fait que toutes les méthodes ont disparu maintenant et travaillez avec les propriétés telles qu'elles sont présentées.

La dernière est une approche "saine", mais si ce que vous utilisez généralement est l'ordre "created_at", alors il est beaucoup plus logique de "stocker" vos données de cette façon à chaque opération, donc lorsque vous les "récupérez", elles restent dans le commande que vous allez utiliser.