使用多个条件查询

时间:2011-06-19 23:19:06

标签: javascript indexeddb

我最近(遗憾地)发现HTML5不再支持WebSQL,而且IndexedDB将替代它。

我想知道是否有任何方法可以查询或搜索IndexedDB的条目,方式与我如何使用SQL搜索满足多个条件的条目类似。

我已经看到我可以使用KeyRange的一个条件搜索IndexedDB。但是,我似乎无法找到任何方法来搜索两列或更多列数据,而无需从数据库中获取所有数据并使用for循环执行此操作。

我知道这是一个新功能,几乎没有在浏览器中实现,但我有一个项目,我正在开始,我正在研究我可以做的不同方式。

谢谢!

5 个答案:

答案 0 :(得分:29)

查看this answer相同的问题。它比我在这里给出的答案更详细。 store.createIndex和IDBKeyRange方法can be an array的keypath参数。所以,粗略的例子:

// In onupgradeneeded
var store = db.createObjectStore('mystore');
store.createIndex('myindex', ['prop1','prop2'], {unique:false});

// In your query section
var transaction = db.transaction('mystore','readonly');
var store = transaction.objectStore('mystore');
var index = store.index('myindex');
// Select only those records where prop1=value1 and prop2=value2
var request = index.openCursor(IDBKeyRange.only([value1, value2]));
// Select the first matching record
var request = index.get(IDBKeyRange.only([value1, value2]));

答案 1 :(得分:3)

假设您的SQL查询类似于:

SELECT * FROM TableName WHERE Column1 = 'value1' AND Column2 = 'value2'

JsStore库中的等效查询:

var Connection = new JsStore.Instance("YourDbName");
Connection.select({
    From: "YourTableName"
    Where: {
        Column1: 'value1',
        Column2: 'value2'
    },
    OnSuccess:function (results){
        console.log(results);
    },
    OnError:function (error) {
        console.log(error);
    }
});

现在,如果你想知道JsStore是什么,让我告诉你它是一个以简化方式查询IndexedDB的库。 Click here了解有关 JsStore

的更多信息

答案 2 :(得分:1)

是的,在索引上打开连续键范围几乎与indexedDB相同。在IndexedDB中无法测试多个条件。它必须在游标循环上完成。

如果您找到解决方案,请告诉我。

BTW,我认为循环游标可能非常快,并且需要比Sqlite更少的内存。

答案 3 :(得分:1)

我已经迟了几年了,但是我想指出Josh的答案是假设条件中的所有“列”都是索引keyPath的一部分。< / p>

如果索引的keyPath之外存在任何所述“列”,则必须在示例中创建的光标迭代的每个条目上测试涉及它们的条件。因此,如果您正在处理此类查询,或者您的索引不是unique,请准备编写一些迭代代码!

在任何情况下,如果您可以将查询表示为布尔表达式,我建议您查看BakedGoods

对于这些类型的操作,除非你执行严格的相等查询(x ===? y,给定x是objectStore或索引键),否则它将始终在焦点对象库上打开游标,但它会为你节省编写自己的游标迭代代码时出现问题:

bakedGoods.getAll({
    filter: "keyObj > 5 && valueObj.someProperty !== 'someValue'",
    storageTypes: ["indexedDB"],
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});

为了完全透明,BakedGoods由 moi 维护。

答案 4 :(得分:0)

我在回答这个问题时提到了一些查询关系的建议,这可能是有意义的:

Conceptual problems with IndexedDB (relationships etc.)

对于一次查询多个字段,看起来在IndexedDB中看起来没有本地方法(我可能是错的;我还是新手),但你当然可以创建一个辅助函数为每个字段使用单独的游标,并对它们进行迭代以查看哪些记录符合所有条件。