Il modo migliore per farlo è in MongoDB 3.2 o versioni successive. Dobbiamo $project
i nostri documenti e utilizzare il $filter
operatore per restituire un sottoinsieme dell'array "topicInfo" che corrisponde alla nostra condizione. E a partire da MongoDB3.2 , possiamo utilizzare $max
nel $project
fase nella cond
ition ed eseguire un'operazione logica sul valore restituito.
La fase finale della pipeline è il $match
fase in cui filtri i documenti con "topicInfo" vuoto utilizzando $exists
operatore di query dell'elemento e notazione punto
per accedere al primo elemento dell'array. Ciò riduce anche la quantità di dati inviati via cavo e il tempo e la memoria utilizzati per decodificare i documenti lato client.
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 } } }
])