{
"_id" : ObjectId("5f6a81a9690a0787557f797e"),
"attributes" : {
"first_name" : "John",
"last_name" : "Doe",
"email" : "john.doe@example.net",
},
"events" : [
{
"id" : "unique-id-1",
"event" : "clicked",
"event_data" : {
"some-data" : 1
}
"created_at" : ISODate("2020-01-01T10:10:10.000Z")
},
{
"id" : "unique-id-2",
"event" : "opened",
"event_data" : {
"some-data" : 1
}
"created_at" : ISODate("2020-01-01T10:10:10.000Z")
},
{
"id" : "unique-id-3",
"event" : "add_to_cart",
"event_data" : {
"some-data" : 1
},
"created_at" : ISODate("2020-01-01T10:10:10.000Z")
},
{
"id" : "unique-id-4",
"event" : "add_to_cart",
"event_data" : {
"some-data" : 1,
},
"created_at" : ISODate("2020-02-01T10:10:10.000Z")
},
]
}
This is my query:
db.clients.aggregate([
{ $match: { "_id" : ObjectId("5f6a81a9690a0787557f797e") }},
{ $unwind : "$events" },
{ $project: {
"_id": "$events.id",
"event": "$events.event",
"event_data": "$events.event_data",
"created_at": "$events.created_at"
}},
{ $sort: { "_id" : -1 }}
])
And this is where I hit a roadblock. I am able to get events sorted by the created_at. However I’d like to show only last events (somehow group it by event).
In my example I would need t return unique-id-1
, unique-id-2
, unique-id-4
(because it is created after unique-id-3
).
What would be the best approach in terms of performance? Also, at this point I need it to be ‘grouped’ by one event, but maybe in the future I’d like to select last 5 records of each event (last 5 add_to_cart
, last 5 opened
, etc.)
Thank you.