MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wählen Sie den letzten Wert des Arrays im Unterdokument aus

Dazu benötigen Sie das Aggregations-Framework. Ich denke, Sie sollten die Struktur wirklich ändern, aber mit dem arbeiten, was Sie haben:

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

In zukünftigen Versionen können Sie einfach das neue $slice verwenden Betreiber:

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

Tatsächlich können Sie "beide" Felder gleichzeitig bearbeiten:

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

Und das ist viel besser als die Verarbeitung mit $unwind und $last um das letzte Element des Arrays abzurufen, wenn $group wird angewendet, um die Daten zurückzubekommen.

Es hat im Grunde die gleiche Leistung wie eine reguläre Abfrage in der neueren Form. In der jetzigen Form wird es langsamer sein.