【问题标题】:Equivalent of where clause in indexeddb相当于 indexeddb 中的 where 子句
【发布时间】:2012-11-11 02:27:58
【问题描述】:

假设我们有一个用于 todolist 的数据库,并且想要查询所有重要且尚未完成的项目。在 SQL 中,我将使用类似的东西

SELECT * FROM todolist WHERE important = true AND state <> 'done'

我们如何在 indexeddb nosql 数据库中执行这种类型的请求? 有索引吗? 另一种方式? 不可能?

据我所知,在important = true 上过滤结果:

objectstore.index('important').openCursor(IDBKeyRange.only('true'))

但我不知道如何过滤state &lt;&gt; 'done',因为我们只有IDBKeyRange.only(z)

而且我不知道如何过滤这两个子句。

注意:在 MongoDB 中我们这样做:

db.userdetails.find({"date_of_join" : "16/10/2010","education":"M.C.A."})

【问题讨论】:

标签: where-clause indexeddb


【解决方案1】:

在 IndexedDB 中查询多个索引有两种方法。 Josh 描述了使用复合索引查询多个字段的最快方法。但是,它具有存储成本并减慢了写入速度。此外,查询必须是先验已知的,因此根据需要创建索引。第二种方法是使用排序合并或其他算法手动键连接。此方法需要对感兴趣的字段进行索引(非复合),并且可以进行所有组合查询。请参阅此处http://dev.yathit.com/ydn-db/nosql-query.html 以了解 ydn-db 库中的排序合并、嵌套循环和之字形合并实现。我会加入更多的关键加入算法。

顺便说一句,通常我们不索引布尔值。如果您的查询字段是布尔数据类型,只需进行表扫描。不指向使用索引。

【讨论】:

    【解决方案2】:

    在 onupgradeneeded 中,根据使用数组的条件创建索引:

    todolistStore.createIndex('importantIncomplete', ['important','state'],{unique:false});
    

    对于您的查询,请执行以下操作:

    var lowerBound = ['true','started'];
    var upperBound = ['true','almostdone'];
    var range = IDBKeyRange.bound(lowerBound,upperBound);
    var request = todolistStore.index('importantIncomplete').openCursor(range);
    

    【讨论】:

    • 我不确定这个上限和下限应该是什么......例如,如果您想搜索不在“阻塞”状态下怎么办?
    【解决方案3】:

    为此,您需要索引,并且可以使用游标检索数据,您可以在其中提供一个过滤器。

    在我的博客 (http://www.kristofdegrave.be/2012/01/indexed-db-reading-multiple-records.html?m=1) 上,您可以找到有关它的更多信息。

    【讨论】:

    • 我需要更多详细信息才能成功回答您的问题。我可以用objectstore.index('important').openCursor(IDBKeyRange.only('true')) 过滤结果,它只在important = true 上过滤。但我不知道如何过滤state &lt;&gt; 'done',因为我们只有IDBKeyRange.only(z)。所以我不知道如何过滤这两个子句。
    • 如果要过滤多个属性,最好的方法是从对象存储中检索所有记录,并在游标方法中保留一个数组,其中只添加符合给定条件的对象。如果你讨厌自己做这一切,你可以寻找一个已经实现这些可能性的库。我写了一个叫 linq2indexeddb (linq2indexeddb.codeplex.com)。
    • 好的,这是我的另一个想法:检索所有内容,然后使用“if”子句进行过滤。我会用 linq 看看解决方案。谢谢。
    • 您的链接已损坏,这就是为什么最好放置实际答案而不是链接。
    猜你喜欢
    • 2010-11-20
    • 2016-06-11
    • 1970-01-01
    • 2022-09-28
    • 2012-06-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多