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

Vælg sidste værdi af array i underdokument

Du har brug for aggregeringsrammen for at gøre dette, jeg synes virkelig, du burde ændre strukturen, men at arbejde med det, du har:

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

I fremtidige udgivelser vil du kun kunne bruge den nye $slice operatør:

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

Faktisk kan du lave "begge" felter på samme tid:

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

Og det er meget bedre end at behandle med $unwind og $last for at få det sidste element i arrayet, når $group anvendes for at få dataene tilbage.

Det har grundlæggende den samme ydeevne som en almindelig forespørgsel i den nyere form. I den nuværende form vil det gå langsommere.



  1. Blanding af PostgreSQL og MongoDB (som Django-backends)

  2. Hvordan indlejrer jeg et løfte i en anden løftefunktion i node.js?

  3. Sådan finder du kun ét dokument med Restivus og Curl

  4. Redis-støttet ASP.NET SessionState-udbyder