4

私のIDBKeyRangeが最初の列でのみフィルタリングされているように見える理由を誰かが説明できますか?

次のように定義されたインデックスがあります。

osDrugs.createIndex("combined", ["name", "strength", "form", "packsize"], {unique: false});

私のクエリはおおよそ次のとおりです。

var transaction = pimsDB.transaction("drugs");
var objectStore = transaction.objectStore("drugs");
var range = IDBKeyRange.bound([tmpName, tmpStrength, tmpForm, tmpPack],[tmpName+"z", tmpStrength + "z", tmpForm+"z", tmpPack+"z"]);
var index = objectStore.index("combined");
var request = index.openCursor(range);

私の結果は、tmpName から tmpName + "z" までフィルタリングしているように見えますが、強度、フォーム、およびパックサイズを完全に無視しています。

誰かが私が間違っていることを見ることができますか?

ああ、すべてのフィールドは文字列として保存されます....

乾杯、

ダン

追加情報:

複合インデックスを使用して作成した別のテーブルは機能しているようです。これらの表の違いは次の 2 つだけです。

1) 機能するテーブルには、インデックスに 2 つのプロパティしかありません。2) 機能するテーブルでは、両方のプロパティが 3 つのプロパティの主キーの一部です。

Chrome の [リソース] タブを使用して、このテーブルで機能することをテストしました。これにより、インデックスを下限キーでフィルター処理してデータを返すことができます。

その他の追加情報:

さらにテストを行った後、FF に切り替えてクロムではないことを確認しましたが、問題を発見したと思います。その複合インデックスの検索が期待どおりに機能するとは思えません...

IDBKeyRange は実際には範囲です...たとえば、入力すると、

["PARA","500","TAB","32"] ["PARAz","500z","TABz","32z"]

IndexedDB は、LB で始まる最初の薬物を検索し、上限で終わる最後の薬物まですべてを選択します。

だからこそ、どんな価値からでも強みを選択できるのだと思います。実際には、「500」で始まる強度をフィルタリングするのではなく、薬物の「500」の最初のインスタンスから最後のインスタンスまでのすべてを選択しています。

私の仮定が正しければ、次の記事はおそらく少し間違っている/誤解を招く可能性があります (ユーザーは範囲ではなく四角形を検索したかったと思われるため:

複数のプロパティに対するインデックス付き DB カーソル範囲

誰かが私が見つけたことを確認し、実際に複数の値で IndexedDB を検索できる方法があるかどうか教えてもらえますか? 上記の記事の最後で、誰かが交差関数について言及していますが、これはうまくいくと思いますが、オンラインで検索すると存在しないようです...

乾杯、

ダン

4

1 に答える 1

5

一般化されたソリューションを次の場所に投稿しました。

https://gist.github.com/inexorabletash/704e9688f99ac12dd336

簡単にまとめると、結果の各次元を検査する必要があり、その次元の境界を超えている値がある場合は、次のもっともらしいキーにスキップします。

于 2015-10-06T19:14:37.613 に答える