Vous mélangez ici quelques méthodes alors que vous pouvez tout faire dans le pipeline d'agrégation. Sinon, c'est juste une question de mettre vos pas dans le bon ordre :
db.collection.aggregate([
{$sort: { createdOn: -1 }},
{$group: { _id: "$itemId",
createdOn: {$first: "$createdOn"},
field1: {$first: "$field1" },
field2: {$first: "$field2" }
}},
{$match: { field1: "foo" }}
])
Triez donc d'abord les documents les plus récents. Grouper sur itemId
( l'ordre sera maintenu pour $first ), puis filtrez avec $match si vous le devez. Mais vos documents groupés seront les derniers.