最近在做一个消息中心功能,其中有个私信功能用了MongoDB做分表存储,要解决的问题是“获取与每个人聊天的最后一条消息”,也就是像聊天软件的会话列表一样。
例(集合名:chat_msg_2022_1):
{send_uid: 1, receive_uid: 2, session_name: 12, msg: {type: "text", body: "第一条", send_time:100, read_status: 0}},
{send_uid: 1, receive_uid: 2, session_name: 12, msg: {type: "text", body: "第二条", send_time:200, read_status: 0}},
{send_uid: 1, receive_uid: 9, session_name: 19, msg: {type: "text", body: "第三条", send_time:300, read_status: 0}}
我的ID是1,我想得和2和9聊天的最新一条记录,也就是“第二条”和“第三条”
尝试搜索“MongoDB获取每个分类最新的一条记录”没有找到答案,通过以下方式已解决!
db.chat_msg_2022_1.aggregate([
{$match: {$or: [{"send_uid": 1}, {"receive_uid": 1}]}},
{$group: {_id: "$session_name", last_msg: {$last: "$$ROOT"}}},
])
核心的是group、
l
a
s
t
、
last、
last、$ROOT
如果想要获取每个分组的第一条记录,把last改成first即可
另外:
聚合后,id会覆盖成聚合的ID,比如上例的_id是session_name,不是MongoDB的ObjectId,如果需要显示原来的objectID,需要再加上replaceRoot
db.chat_msg_2022_1.aggregate([
{$match: {$or: [{"send_uid": 1}, {"receive_uid": 1}]}},
{$group: {_id: "$session_name", last_msg: {$last: "$$ROOT"}}},
{$replaceRoot: { newRoot: "$last_msg" }}
])
获取我的会话列表,同时计算我与每个人对话的未读消息数量。主要涉及到对group加条件
db.chat_msg_2022_1.aggregate([
{$match: {$or: [{"send_uid": 1}, {"receive_uid": 1}]}},
{$group: {_id: "$session_name", last_msg: {$last: "$$ROOT"}, not_read_num: {$sum: {$cond: [{"$eq": ["$msg.read_status", 0]}, 1, 0]}}}},
{$skip: 0},
{$limit: 2}
])
版权声明:本文为goddnss原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。