La meilleure façon optimale de le faire est dans MongoDB 3.2 ou plus récent. Nous devons $project
nos documents et utilisez le $filter
pour renvoyer un sous-ensemble du tableau "topicInfo" qui correspond à notre condition. Et à partir de MongoDB3.2 , nous pouvons utiliser le $max
dans le $project
étape dans le cond
ition expression et effectuer une opération logique sur la valeur renvoyée.
La dernière étape du pipeline est le $match
étape où vous filtrez ces documents avec "topicInfo" vide en utilisant le $exists
opérateur de requête d'élément et la notation par points
pour accéder au premier élément du tableau. Cela réduit également à la fois la quantité de données envoyées sur le réseau et le temps et la mémoire utilisés pour décoder les documents côté 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 } } }
])