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

Seleziona l'ultimo valore dell'array nel documento secondario

Hai bisogno del framework di aggregazione per farlo, penso che dovresti davvero cambiare la struttura, ma lavorando con quello che hai:

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

Nelle versioni future potrai semplicemente usare il nuovo $slice operatore:

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

Infatti puoi fare "entrambi" i campi contemporaneamente:

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

Ed è molto meglio che elaborare con $unwind e $last per ottenere l'ultimo elemento dell'array quando $group viene applicato per recuperare i dati.

Fondamentalmente ha le stesse prestazioni di una normale query nella forma più recente. Nella forma attuale, sarà più lento.