How to get last message from chat conversation in mongodb

你。 提交于 2019-12-11 02:23:32

问题


I have tried to get last message in chat between users. Below is my collections in my document.

{
"toUser":123,"fromUser":456,"message":"1 from suresh","timeStamp":"2019-10-09 16:39:14:1414 PM +05:30",

"toUser":456,"fromUser":123,"message":"Man super man ","timeStamp":"2019-10-09 16:43:09:0909 PM +05:30",

"toUser":456,"fromUser":123,"message":"Kk","timeStamp":"2019-10-09 18:31:12:1212 PM +05:30"

"toUser":456,"fromUser":123,"message":"It working man","timeStamp":"2019-10-09 18:31:18:1818 PM +05:30"

"toUser":456,"fromUser":123,"message":"2","timeStamp":"2019-10-09 18:31:21:2121 PM +05:30"

"toUser":101,"fromUser":123,"message":"Kk","timeStamp":"2019-10-09 18:31:12:1212 PM +05:30"
} 

and i used mongo query as

db.chats.aggregate(
[
    {$match:{$or:[{"toUser":123},{"fromUser":123}]}},
    { "$sort": { "timeStamp": -1}},    
    {
        "$group": {
           "_id": {fromUser:"$fromUser",toUser:"$toUser"},
           "fromUser": {"$first":"$fromUser"},
           "toUser" : {"$first":"$toUser"},
           "message": {"$first": "$message" },
            "timeStamp": { "$first": "$timeStamp"}
        }
    },
]
);

and my output is

{ "_id" : { "fromUser" : 456, "toUser" : 123 }, "fromUser" : 456, "toUser" : 123, "message" : "1 from suresh", "timeStamp" : "2019-10-09 16:39:14:1414 PM +05:30" }
{ "_id" : { "fromUser" : 123, "toUser" : 101 }, "fromUser" : 123, "toUser" : 101, "message" : "Kk", "timeStamp" : "2019-10-09 18:31:12:1212 PM +05:30" }
{ "_id" : { "fromUser" : 123, "toUser" : 456 }, "fromUser" : 123, "toUser" : 456, "message" : "2", "timeStamp" : "2019-10-09 18:31:21:2121 PM +05:30" }

But If you look actual last message between 123 and 456 users is message:2

so I need final output as below sorted on timestamp.


{ "_id" : { "fromUser" : 123, "toUser" : 456 }, "fromUser" : 123, "toUser" : 456, "message" : "2", "timeStamp" : "2019-10-09 18:31:21:2121 PM +05:30" }
{ "_id" : { "fromUser" : 123, "toUser" : 101 }, "fromUser" : 123, "toUser" : 101, "message" : "Kk", "timeStamp" : "2019-10-09 18:31:12:1212 PM +05:30" }

Can anybody help me to solve the query.

Thanks in advance.


回答1:


The problem is how messages are stored.

Data stored:

fromUser 123 and toUser 456
fromUser 456 and toUser 123

So, when you group it, logically they are same, but not for grouping.

Solution:

We need to ensure that sender / receiver comes always in the same way


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"
      }
    }
  }
])

Result


[
  {
    "_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
  }
]

MongoPlayground



来源:https://stackoverflow.com/questions/58315678/how-to-get-last-message-from-chat-conversation-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!