sql >> Database >  >> NoSQL >> MongoDB

Selecteer laatste waarde van array in subdocument

Je hebt het aggregatieraamwerk nodig om dit te doen, ik denk dat je de structuur echt moet veranderen, maar werken met wat je hebt:

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

In toekomstige releases kun je gewoon de nieuwe $slice . gebruiken operator:

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

In feite kunt u "beide" velden tegelijkertijd doen:

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

En dat is een stuk beter dan verwerken met $unwind en $last om het laatste element van de array te krijgen wanneer $group wordt toegepast om de gegevens terug te krijgen.

Het heeft in principe dezelfde prestaties als een gewone zoekopdracht in de nieuwere vorm. In de huidige vorm zal het langzamer zijn.



  1. Mongoose subdocument zoeken/bijwerken

  2. hoe string naar numerieke waarden in mongodb te converteren

  3. Ingesloten document vervangen met Mongo C# 2.0-stuurprogramma

  4. Zoek document met array dat een specifieke waarde bevat