sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta underdokument som matchar maximalt värde i arrayen

Det optimala bästa sättet att göra detta är i MongoDB 3.2 eller senare. Vi måste $project våra dokument och använd $filter operatorn för att returnera en delmängd av "topicInfo"-matrisen som matchar vårt villkor. Och från och med MongoDB3.2 kan vi använda $max i $project steg i cond tion-uttryck och utför en logisk operation på det returnerade värdet.

Det sista steget i pipelinen är $match steg där du filtrerar bort dessa dokument med tomma "topicInfo" med hjälp av $finns elementfrågeoperator och punktnotation för att komma åt det första elementet i arrayen. Detta minskar också både mängden data som skickas över tråden och tiden och minnet som används för att avkoda dokument på klientsidan.

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 } } }
])


  1. JasperFillManager.fillReport och mongo?

  2. Välj poster som matchar konkatvärde för två fält i mongodb

  3. Hur kör man ett dynamiskt antal kriterier i mongoose.find?

  4. MongoDB \uXXXX problem