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

Comment récupérer le dernier objet d'un tableau dans un document intégré dans Mongoose ?

Votre "dernier" document sera toujours à la fin de votre tableau à moins que vous ne le modifiiez d'une manière ou d'une autre. L'ajout d'éléments dans des tableaux ira toujours à la "fin" ou à "l'ajout" des éléments existants lorsqu'il est utilisé avec le $push opérateur ou ajouté à l'aide de méthodes de manipulation de tableaux dans le code client.

Seuls les opérateurs comme $addToSet ou en utilisant explicitement des modificateurs pour le $push l'opération changera cela.

En tant que tel, à la fin d'un tableau, ce que vous voulez généralement faire est d'utiliser $slice , avec un index négatif pour obtenir les éléments de la "fin" du tableau :

Model.findById("55d3a39565698bbc68079e31")
    .select({ "comments": { "$slice": -1 }})
    .exec(function(err,doc) {

    })

Si vous avez réellement modifié le tableau comme mentionné précédemment où la dernière date n'est pas le dernier élément du tableau, vous devriez utiliser le $sort modificateur sur les mises à jour. Ce ne serait généralement "hors de propos" que si vous demandiez la $position modificateur ou vous avez utilisé $addToSet . La $position serait délibéré et vous ne pouvez pas également trier, mais vous pouvez toujours trier le tableau après un $addToSet opération comme celle-ci, qui place toutes les dates dans l'ordre sans changer aucun autre contenu du tableau :

Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
   { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)

Avec le tableau modifié, le même $slice l'opération s'applique aux requêtes car le tableau est maintenant trié par date.

Si toutefois votre intention est de laisser le tableau dans vos documents dans le désordre, ou dans l'autre ordre que vous souhaitez, mais que vous souhaitez également obtenir la dernière date, vous pouvez utiliser .aggregate() à $sort et récupérez le $last entrée de tableau :

Model.aggregate(
    [
        { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
        { "$unwind": "$comments" },
        { "$sort": { "comments.date": 1 } },
        { "$group": {
            "_id": "$_id",
            "author": { "$first": "$author" },
            "link": { "$first": "$link" },
            "title": { "$first": "$title" },
            "date": { "$first": "$date" },
            "comments": { "$last": "$comments" }
        }}
    ]
)

Notant que lors de l'utilisation du framework d'agrégation avec mongoose, le _id "l'autocasting" qui se produit dans d'autres requêtes ne se produit pas (c'est par conception), il est donc nécessaire de convertir en un ObjectId évaluez-vous, si les données ne sont pas déjà disponibles sous cette forme et sont arrivées sous forme de chaîne.

Ce sont vos façons d'obtenir le dernier élément (éventuellement trié explicitement) d'un tableau.