De optimale manier om dit te doen is in MongoDB 3.2 of nieuwer. We moeten $project
onze documenten en gebruik de $filter
operator om een subset van de array "topicInfo" te retourneren die overeenkomt met onze voorwaarde. En vanaf MongoDB3.2 kunnen we de $max
in het $project
stadium in de cond
ition-expressie en voer een logische bewerking uit op de geretourneerde waarde.
De laatste fase in de pijplijn is de $match
fase waarin u die documenten uitfiltert met lege "topicInfo" met behulp van de $exists
element query-operator en de puntnotatie
om toegang te krijgen tot het eerste element in de array. Dit vermindert ook zowel de hoeveelheid gegevens die over de kabel worden verzonden als de tijd en het geheugen die worden gebruikt om documenten aan de clientzijde te decoderen.
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 } } }
])