sql >> Databasteknik >  >> NoSQL >> MongoDB

Välj det sista värdet för matrisen i underdokumentet

Du behöver aggregeringsramverket för att göra detta, jag tycker att du verkligen borde ändra strukturen, men arbeta 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 framtida utgåvor kommer du bara att kunna använda den nya $slice operatör:

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

Du kan faktiskt göra "båda" fälten samtidigt:

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

Och det är mycket bättre än att bearbeta med $unwind och $last för att få det sista elementet i arrayen när $group används för att få tillbaka data.

Den har i princip samma prestanda som en vanlig fråga i den nyare formen. I den nuvarande formen kommer det att gå långsammare.



  1. NodeJS - MongoClient.Anslut med URL till DB Other Than Default

  2. Mongodb infogar dokument utan _id-fält

  3. Gruppuppsättning efter varva ner och matcha

  4. Diakritisk skiftlägeskänslig sökning Loopback