首页 > 解决方案 > 如何在消息传递数据库中获取最新消息?(重新思考数据库)

问题描述

嗨,我正在构建一个聊天消息系统,并且是我第一次读/写数据库。我正在创建方法调用来检索此聊天所需的相关数据。与大多数聊天系统一样,我想要一个包含名称、最新消息以及与最新消息关联的时间/日期的消息的一般列表。单击该线程后,将显示相应的消息。我正在尝试调用数据库,但无法使用正确的命令获取最新消息。

这是一条消息包含的内容:

{
   "_id":  "134a8cba-2195-4ada-bae2-bc1b47d9925a" ,
   "clinic_id": 1 ,
   "created": 1531157560 ,
   "direction":  "o" ,
   "number":  "14383411234" ,
   "read": true ,
   "text":  "hey hows it going"
}

发送和接收的每条消息都会像这样发布。我无法想出正确的命令来获取所有不同的最新消息, "number"因此对于numberx,我得到其相应的最近消息,而对于numbery,我得到其相应的最近消息。"created"是在 UNIX 时间中创建消息的时间。

这就是我开始的:

检索所有线程号:

r.db('d2').table('sms_msg').between([1, r.minval], [1, r.maxval], {index:'clinic_number'}).pluck(['number']).distinct()

检索特定线程中的所有消息:

r.db('d2').table('sms_msg').getAll([1, "14383411234"], {index:'clinic_number'})

检索所有不同线程的最近消息:

r.db('d2').table('sms_msg').filter()....???

一些帮助将不胜感激!

标签: nosqlrethinkdb

解决方案


对于任何数据库来说,这都是一个非常棘手的查询,并且通常涉及大量子查询。您可能需要考虑对其进行非规范化,为每个number.

但基本上,使用您当前的方法,这可能有效(未经测试)但效率可能非常低:

r.table('sms_msg').orderBy(r.desc('created')).group('number').nth(0)

获取文档属性的最低值通常很快,但是当您想要像这样的排序列表的整个文档时,根据我的经验,这是非常低效的。


推荐阅读