web-dev-qa-db-ja.com

複数の条件を使用したクエリ

私は最近(悲しいことに)WebSQLがHTML5でサポートされなくなったことと、代わりにIndexedDBがそれを置き換えることを発見しました。

SQLを使用して複数の条件を満たすエントリを検索する方法と同様の方法で、IndexedDBのエントリをクエリまたは検索する方法があるかどうか疑問に思っています。

KeyRangeの1つの条件を使用してIndexedDBを検索できることを確認しました。ただし、データベースからすべてのデータを取得してforループを使用せずに2列以上のデータを検索する方法を見つけることができないようです。

これはブラウザにほとんど実装されていない新機能であることは知っていますが、現在プロジェクトを開始しており、さまざまな方法を調査しています。

ありがとうございました!

33
jthereliable

チェックアウト この答え 同じ質問に。私がここで与える答えよりも詳細です。 store.createIndexメソッドとIDBKeyRangeメソッドのキーパスパラメータ 配列の場合もあります 。だから、大まかな例:

// 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]));
29
Josh

あなたの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にクエリを実行するライブラリであることをお伝えします。 ここをクリックJsStoreの詳細について

3
user6422990

私は数年遅れていますが、ジョシュの答えは条件内のすべての「列」がインデックスのkeyPathの一部であるという前提で機能することを指摘したいと思います。

上記の「列」のいずれかがインデックスのkeyPathの外に存在する場合は、例で作成されたカーソルが反復する各エントリでそれらを含む条件をテストする必要があります。したがって、このようなクエリを処理している場合、またはインデックスがuniqueでない場合は、反復コードを書く準備をしてください!

いずれにせよ、クエリをブール式で表すことができる場合は BakedGoods を確認することをお勧めします。

これらのタイプの操作では、厳密な等価クエリ(x ===? y、xがobjectStoreまたはインデックスキーである場合)、独自のカーソル反復コードを記述する手間を省きます。

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

完全な透明性のために、BakedGoodsはmoiによって維持されます。

1
Kevin

はい、インデックスの連続したキー範囲を開くことは、indexedDBの場合とほとんど同じです。 IndexedDBでは、複数の条件のテストはできません。カーソルループで実行する必要があります。

解決策を見つけた場合はお知らせください。

ところで、ループカーソルは非常に高速で、Sqliteの場合よりも必要なメモリが少ないと思います。

1
Kyaw Tun

私はこの質問への私の回答で関係をクエリするためのいくつかの提案に言及していますが、これは興味深いかもしれません:

IndexedDBの概念的な問題(関係など)

一度に複数のフィールドをクエリすることに関しては、それをIndexedDBで行うネイティブの方法があるようには見えません(私は間違っている可能性があります;私はまだそれに慣れていません)確かに、別のを使用するヘルパー関数を作成できます各フィールドにカーソルを移動し、それらを繰り返して、どのレコードがすべての基準を満たしているかを確認します。

0
Matt Browne