O que você quer é algo que pode ser alcançado com a estrutura de agregação. A forma básica de ( que é útil para outros ) é:
db.collection.aggregate([
// Group by the grouping key, but keep the valid values
{ "$group": {
"_id": "$chainId",
"docId": { "$first": "$_id" },
"messageId": { "$first": "$messageId" },
"createOn": { "$first": "$createdOn" }
}},
// Then sort
{ "$sort": { "createOn": -1 } }
])
Para que "agrupe" nos valores distintos de "messageId" enquanto estiver usando o
$first
valores de limite para cada um dos outros campos. Como alternativa, se você quiser o maior, use $último
em vez disso, mas para menor ou maior por linha, provavelmente faz sentido $sort
primeiro, caso contrário, use $ min
e $max
se a linha inteira não for importante. Veja o MongoDB
aggregate()
documentação para obter mais informações sobre o uso, bem como a documentação do conector JavaDocs e SpringData Mongo do driver para mais uso do método agregado e possíveis auxiliares.