Você está misturando alguns métodos aqui quando pode fazer tudo no pipeline de agregação. Caso contrário, é apenas uma questão de colocar seus passos na ordem certa:
db.collection.aggregate([
{$sort: { createdOn: -1 }},
{$group: { _id: "$itemId",
createdOn: {$first: "$createdOn"},
field1: {$first: "$field1" },
field2: {$first: "$field2" }
}},
{$match: { field1: "foo" }}
])
Portanto, classifique primeiro os documentos mais recentes. Agrupe no
itemId
( a ordem será mantida por $first ) e, em seguida, filtre com $match se for necessário. Mas seus documentos agrupados serão os mais recentes.