MongoDB获取每个分类最新一条完整记录(会话列表、每个班级成绩最高的一名学生….)

  • Post author:
  • Post category:其他

最近在做一个消息中心功能,其中有个私信功能用了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 版权协议,转载请附上原文出处链接和本声明。