我最近发现(遗憾的是)HTML5不再支持WebSQL,而且IndexedDB将替代它.
我想知道是否有任何方法可以查询或搜索IndexedDB的条目,方式与我如何使用SQL搜索满足多个条件的条目类似.
我已经看到我可以使用KeyRange的一个条件搜索IndexedDB.但是,我似乎无法找到任何方法来搜索两列或更多列数据,而无需从数据库中获取所有数据并使用for循环执行此操作.
我知道这是一个新功能,几乎没有在浏览器中实现,但我有一个项目,我正在开始,我正在研究我可以做的不同方式.
谢谢!
我想从WebSql更改为Indexeddb.但是,如何进行SQL查询
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com'
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and age = 30
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@bill@company.com' and name = 'Bill'
etc
Run Code Online (Sandbox Code Playgroud)
使用IndexedDB?例如,我在阅读indexedDb 的文档时注意到,所有示例当时只查询一个索引.所以你可以做到
var index = objectStore.index("ssn");
index.get("444-44-4444").onsuccess = function(event) {
alert("Name is " + event.target.result.name);
};
Run Code Online (Sandbox Code Playgroud)
但我需要同时查询多个索引!
我还发现了一些关于复合索引的有趣帖子,但它们只有在查询复合索引中的所有字段时才有效.
我花了几个小时来搜索这个,只是通过反复试验才能最终找到解决方案.在Stack Overflow中记录此信息,供将来的搜索者使用.
问:
如何在indexeddb中创建复合键?
使用以下内容在对象库上的indexeddb中创建键:
var db;
var openRequest = indexedDB.open('myDB', 1);
openRequest.addEventListener('error', () => {
console.error('Unable to open db');
});
openRequest.addEventListener('upgradeneeded', function(event){
var store = db.createObjectStore('myStore',
{keyPath: /* composite key */ }
);
});
openRequest.addEventListener('success', function(){
db = openRequest.result;
});
Run Code Online (Sandbox Code Playgroud)
我尝试过放置对象,多次定义,如何创建复合键,或者这是API的限制?
注意:如果您正在寻找如何使用范围查询复合键,请查看此文章
我想对从indexedDB获得的结果进行排序.
每条记录都有{id,text,date}结构,其中'id'是keyPath.
我想按日期对结果进行排序.
我目前的代码如下:
var trans = db.transaction(['msgs'], IDBTransaction.READ);
var store = trans.objectStore('msgs');
// Get everything in the store;
var keyRange = IDBKeyRange.lowerBound("");
var cursorRequest = store.openCursor(keyRange);
cursorRequest.onsuccess = function(e) {
var result = e.target.result;
if(!!result == false){
return;
}
console.log(result.value);
result.continue();
};
Run Code Online (Sandbox Code Playgroud) 我在indexeddb对象库上有两个属性的复合索引,并希望根据这两个属性的范围检索游标.
这是商店中的示例对象:
{species: 'Oak',xcoord: 123456, ycoord: 654321}
Run Code Online (Sandbox Code Playgroud)
和索引:
treeStore.createIndex("treelocation", ["xcoord","ycoord"], { unique: false });
Run Code Online (Sandbox Code Playgroud)
索引创建是成功的,我可以在Chrome开发人员工具中看到它,但是现在我想在x和y坐标上打开一个带有键范围的光标(这将是地图的范围).
在线搜索我看不到怎么做,打开带有一系列键范围的索引似乎不起作用.
谢谢
安德鲁
假设我们为todolist建立了一个数据库,并希望查询所有重要且尚未完成的项目.在SQL中,我将使用类似的东西
SELECT * FROM todolist WHERE important = true AND state <> 'done'
Run Code Online (Sandbox Code Playgroud)
我们如何在indexeddb nosql数据库中执行该类型的请求?有索引吗?其他方式?不可能?
据我所知过滤结果important = true:
objectstore.index('important').openCursor(IDBKeyRange.only('true'))
Run Code Online (Sandbox Code Playgroud)
但我不知道如何过滤,state <> 'done'因为我们只得到了IDBKeyRange.only(z).
我不知道如何过滤这两个条款.
注意:在MongoDB中我们做:
db.userdetails.find({"date_of_join" : "16/10/2010","education":"M.C.A."})
Run Code Online (Sandbox Code Playgroud) 有没有办法在IndexedDB中对同一属性执行OR或IN查询?
换句话说,我如何得到结果,
SELECT * FROM MyTable WHERE columnA IN ('ABC','DFT') AND columnB = '123thd'
Run Code Online (Sandbox Code Playgroud)
谢谢!
IndexedDB 允许您在多个属性上创建索引。就像你有对象一样,{a: 0, b: 0}你可以在a和上创建索引b。
复合索引的行为非常奇怪,但显然应该可以使用比复合索引短的数组进行查询。所以在我的例子中,我应该能够查询类似的东西[0]并获得 a==0 的结果。
但我似乎无法让它发挥作用。这是您可以在 JS Bin 上运行的示例:
var db;
request = indexedDB.open("test", 1);
request.onerror = function (event) { console.log(event); };
request.onupgradeneeded = function (event) {
var db = event.target.result;
db.onerror = function (event) { console.log(event); };
var store = db.createObjectStore("store", {keyPath: "id", autoIncrement: true});
store.createIndex("a, b", ["a", "b"], {unique: true});
store.add({a: 0, b: 0});
store.add({a: 0, b: 1});
store.add({a: 1, b: 0});
store.add({a: …Run Code Online (Sandbox Code Playgroud)