Stai mescolando alcuni metodi qui quando puoi fare tutto nella pipeline di aggregazione. Altrimenti si tratta solo di mettere i tuoi passi nell'ordine giusto:
db.collection.aggregate([
{$sort: { createdOn: -1 }},
{$group: { _id: "$itemId",
createdOn: {$first: "$createdOn"},
field1: {$first: "$field1" },
field2: {$first: "$field2" }
}},
{$match: { field1: "foo" }}
])
Quindi ordina prima i documenti più recenti. Raggruppa su itemId
(l'ordine verrà mantenuto per $first ), quindi filtra con $match se necessario. Ma i tuoi documenti raggruppati saranno gli ultimi.