首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IndexedDB中按条件排序的分组选择

IndexedDB中按条件排序的分组选择
EN

Stack Overflow用户
提问于 2014-10-22 18:55:36
回答 3查看 935关注 0票数 2

我有一个带有“时间戳”和"chat_id“字段的对象存储”消息“。我想在这个按“时间戳”字段排序的对象存储中获取所有的“聊天”。据我所见,我不能只用IndexedDB做这件事。

我可以这样使用WebDatabase:

代码语言:javascript
复制
SELECT * FROM messages GROUP BY chat_id ORDER BY timestamp

在IndexedDB中:

  1. 如果使用"chat_id“、”时间戳“创建复合索引,则记录仍然不会按”时间戳“字段排序。相反,它们将首先按照"chat_id“进行排序。因此,带有"chat_id“== 1的2年前消息将在昨天编写的"chat_id”== 2消息之前。
  2. 如果我创建"chat_id“的简单索引,并使用”chat唯一“从该索引中获取记录,则使用主键对相同的聊天消息进行排序。在我的例子中,它是信息"id“。

我说错了吗?是否可以在IndexedDB中对分组选择进行排序?

UPD:我想让所有的聊天按chat_id“分组”,并根据时间戳对所选内容进行排序。所以最新的谈话将是第一次。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-29 21:34:03

为了澄清,您希望首先从包含具有最低时间戳的消息的chat_id中发出所有消息,然后是包含消息的chat_id的所有消息(到目前为止尚未看到)--下一个最低时间戳,等等?

在这里,索引DB没有提供任何特别有用的东西。

一个简单的方法将使用两个索引:一个在时间戳上,一个在chat_id上。

  1. 让set成为一个新的空集
  2. 在时间戳索引上打开无界游标
  3. 对于所看到的每一条消息:
    1. 如果消息的chat_id位于set 中
      1. continue()光标

代码语言:javascript
复制
1. Otherwise:  
    1. add `chat_id` to _set_
    2. open a cursor on the chat\_id index with `IDBKeyRange.only(chat_id)` as bounds
    3. fetch all the records

票数 1
EN

Stack Overflow用户

发布于 2017-10-21 13:46:23

您可以使用JsStore执行indexeddb中的组by、order或几乎所有类型的sql查询。它提供了与sql完全相同的api。

因此,假设您在sql中的查询是-

代码语言:javascript
复制
SELECT * FROM messages GROUP BY chat_id ORDER BY timestamp

在JsStore,它将是-

代码语言:javascript
复制
var Connection = JsStore.Instance('Db_name');
Connection.select({
     From: 'messages',
     GroupBy:'chat_id',
     Order:{
        By:'timestamp'
     },
     OnSuccess:function(results){
        console.log(results);
     },
     OnError:function(error){
        console.log(error);
     }
})

有关更多信息,请查看此链接- http://jsstore.net/

票数 1
EN

Stack Overflow用户

发布于 2014-10-23 03:27:24

正如您所说,可以在indexedDB中对分组选择进行排序。但从你的问题中还不完全清楚你在问什么(至少对我来说是这样)。

尝试使用“时间戳”、“chat_id”,然后只使用next/prev,而不是next唯一/prevunique。您希望按照要在游标上迭代的顺序对索引字段进行排序。如果要按时间排序,则将时间戳作为第一个字段。事实上,这应该具有先按时间排序然后再按聊天id排序的效果。当然,这意味着您将在同一时间收到来自不同地方的不同聊天的消息。

如果具有相同聊天id的消息必须是连续的,那么只需使用'next‘和cursor.continue,然后继续使用' chat _id’、‘时间戳’。迭代时,只需检查chat_id是否与上一次迭代发生了更改,以查看是否开始了新的聊天。

还不清楚您为什么在这里使用not唯一。如果没有两条具有相同聊天id的消息也可以具有相同的时间戳,index唯一只会遍历整个索引/存储。几乎每个键在索引中都是唯一的,所以这是没有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26515004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档