What I want is to find documents but dropping duplicates by some key, retrieving only the updated document (by a date field)
So for this collection:
{
"key": "a",
"time": ISODate("2021-10-20T00:00:00.000Z")
},
{
"key": "a",
"time": ISODate("2020-10-20T00:00:00.000Z")
},
{
"key": "b",
"time": ISODate("2020-10-20T00:00:00.000Z")
},
{
"key": "b",
"time": ISODate("2019-10-20T00:00:00.000Z")
}
We will get the following docs:
{
"key": "a",
"time": ISODate("2021-10-20T00:00:00.000Z")
},
{
"key": "b",
"time": ISODate("2020-10-20T00:00:00.000Z")
}
How can I do that?
>Solution :
$sort
– Order the documents bykey
ASC andtime
DESC.$group
– Group bykey
and take the first document asdata
.$replaceWith
– Decorate output document withdata
.
db.collection.aggregate([
{
"$sort": {
"key": 1,
"time": -1
}
},
{
$group: {
_id: "$key",
"data": {
$first: "$$ROOT"
}
}
},
{
"$replaceWith": "$data"
}
])