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

Rufen Sie Unterdokumente ab, die mit dem Höchstwert im Array übereinstimmen

Der optimale beste Weg, dies zu tun, ist in MongoDB 3.2 oder neuer. Wir müssen $project unsere Dokumente und verwenden Sie den $filter -Operator, um eine Teilmenge des "topicInfo"-Arrays zurückzugeben, die unserer Bedingung entspricht. Und ab MongoDB3.2 können wir den $max verwenden im $project Stufe in der cond itionsausdruck und führen Sie eine logische Operation mit dem zurückgegebenen Wert aus.

Die letzte Stufe in der Pipeline ist der $match Phase, in der Sie diese Dokumente mit leerem „topicInfo“ mithilfe des Codes $existiert -Element-Abfrageoperator und die Punktnotation um auf das erste Element im Array zuzugreifen. Dadurch werden sowohl die über das Kabel gesendete Datenmenge als auch die zum Decodieren von Dokumenten auf der Client-Seite benötigte Zeit und der benötigte Speicherplatz reduziert.

db.collection.aggregate([
    { "$project": { 
        "topicInfo": { 
            "$filter": { 
                "input": "$topicInfo", 
                "as": "t", 
                "cond": { 
                    "$and": [ 
                        { "$eq": [ "$$t.topic", "topic2"] }, 
                        { "$eq": [ "$$t.time", { "$max": "$topicInfo.time" } ] }
                    ] 
                } 
            } 
        } 
    }},
    { "$match": { "topicInfo.0": { "$exists": true } } }
])