mongodb储存即时聊天的时候如何取出用户聊天列表

浏览:44日期:2023-06-25

问题描述

{'_id' : ObjectId('576cfd363325ffaa1dbdde15'),'current_uid' : '5','to_uid' : '3','content' : '你大爷' }, {'_id' : ObjectId('576cfd6e3325ff501e07f4ae'),'current_uid' : '5','to_uid' : '3','content' : '郭德纲' }, {'_id' : ObjectId('576cfe753325ff501ea76603'),'current_uid' : '5','to_uid' : '4','content' : '325235' }

存的时候如上所示,想要获取用户ID为5的这个跟哪些人聊过天,也就是3和4这2个用户,现在想要获取包括content的信息,也就是跟该用户最新的一条记录,比如3这个用户,我要获取的就是郭德纲这个content而不是上面那条,这个应该怎么查询,初学mongodb,球帮助

问题解答

回答1:

这是一个很典型的分组TOP N问题,放到SQL数据库里面也有相应的表达方式,比如SQLServer的

ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

MongoDB里面用aggregation就可以解决了。aggregation是个很大的话题,这里没法讲解全部内容,下面用到的各种操作符只能自己去查下文档理解。

db.chat.aggregate([ {$match: {current_uid: '5'}}, {$sort: {_id: -1}}, {$group: {_id: {current_uid: '$current_uid', to_uid: '$to_uid'}, content: {$first: '$content'}}}])

几点解释:

使用{$sort: {_id: -1}}其实就是时间倒序。_id里面包含了时间,对它的排序大部分时候可以认为是对时间的排序;

$first取到了第一个元素。如果想取头n个元素怎么办?$push+$slice就可以了;

以上查询怎么能更快?db.chat.createIndex({current_uid: 1, _id: 1})

相关文章: