Problem polega na tym, jak wiadomości są stored
.
Przechowywane dane:
fromUser 123 and toUser 456
fromUser 456 and toUser 123
Tak więc po zgrupowaniu logicznie są takie same , ale not for grouping
.
Rozwiązanie:
Musimy mieć pewność, że nadawca/odbiorca przychodzi zawsze w ten sam sposób
1. Create array where we store sender / receiver
2. Order that array `[123, 456] [456, 123] => [123,456], [123,456]`
3. Group by this ordered array (In Mongo way: $project, $unwind, $sort, $group - push)
db.chats.aggregate([
{
$match: {
$or: [
{
"toUser": 123
},
{
"fromUser": 123
}
]
}
},
{
"$project": {
toUser: 1,
fromUser: 1,
message: 1,
timeStamp: 1,
fromToUser: [
"$fromUser",
"$toUser"
]
}
},
{
$unwind: "$fromToUser"
},
{
$sort: {
"fromToUser": 1
}
},
{
$group: {
_id: "$_id",
"fromToUser": {
$push: "$fromToUser"
},
"fromUser": {
"$first": "$fromUser"
},
"toUser": {
"$first": "$toUser"
},
"message": {
"$first": "$message"
},
"timeStamp": {
"$first": "$timeStamp"
}
}
},
{
"$sort": {
"timeStamp": -1
}
},
{
"$group": {
"_id": "$fromToUser",
"fromUser": {
"$first": "$fromUser"
},
"toUser": {
"$first": "$toUser"
},
"message": {
"$first": "$message"
},
"timeStamp": {
"$first": "$timeStamp"
}
}
}
])
Wynik
[
{
"_id": [
101,
123
],
"fromUser": 123,
"message": "Kk",
"timeStamp": "2019-10-09 18:31:12:1212 PM +05:30",
"toUser": 101
},
{
"_id": [
123,
456
],
"fromUser": 123,
"message": "2",
"timeStamp": "2019-10-09 18:31:21:2121 PM +05:30",
"toUser": 456
}
]