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

Sélectionnez la dernière valeur du tableau dans le sous-document

Vous avez besoin du cadre d'agrégation pour ce faire, je pense que vous devriez vraiment changer la structure, mais en travaillant avec ce que vous avez :

Model.aggregate(
    [
       { "$match": { "prices.100": { "$exists": true } }},
       { "$unwind": "$prices.100" },
       { "$group": {
          "_id": "$_id",
          "price": { "$last": "$prices.100" }
       }},
       { "$project": { "_id": 0, "prices.100": "$price" } }
     ]
) 

Dans les prochaines versions, vous pourrez simplement utiliser le nouveau $slice opérateur :

Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

En fait vous pouvez faire "les deux" champs en même temps :

Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] },
            "prices.101": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

Et c'est bien mieux que de traiter avec $unwind et $last pour obtenir le dernier élément du tableau lorsque $group est appliqué pour récupérer les données.

Il a essentiellement les mêmes performances qu'une requête régulière dans le nouveau formulaire. Sous la forme actuelle, cela va être plus lent.