如何从mongodb的聊天对话中获取最新消息

编程入门 行业动态 更新时间:2024-10-21 17:32:37
本文介绍了如何从mongodb的聊天对话中获取最新消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我试图获取用户之间聊天中的最后一条消息。 以下是我在文档中的收藏集。

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

而我使用mongo查询为

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

我的输出是

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

但是如果您查看的是介于123和456之间的实际最后一条消息用户是消息:2

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.

请先谢谢。

推荐答案

问题是存储消息的方式。

存储的数据:

fromUser 123 and toUser 456 fromUser 456 and toUser 123

因此,当您将其分组时,在逻辑上 它们是相同的 ,但不是用于分组。

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

解决方案:

我们需要确保发送方/接收方总是以相同的方式出现

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

结果

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

更多推荐

如何从mongodb的聊天对话中获取最新消息

本文发布于:2023-10-24 14:34:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1524192.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:最新消息   mongodb

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!