ここで何年も読んだ後、ついに登録して質問をしました。私は最近 IndexedDB をいじっていて、複合インデックスの問題に遭遇しました (ここの例と同じように使用しています)。
オブジェクトストアに、文字列値といくつかの整数値を持つオブジェクトがあります。例:
[description:text, value1:int, value2:int, value3:int]
次のように、このオブジェクトに複合インデックスを作成しました。
("compoundIndex", ["value1" , "value2" , "value3"] , { unique: false });
HTML には、ユーザーが特定のエントリを検索できるようにする、いくつかの選択ボックスとテキストフィールドがあります。整数はキー範囲としてインデックスの opencursor-function に渡されます。次に、結果のセットで indexOf(textfield) を使用します (ここで行われたように)
選択ボックスに値がある場合、その値が上限と下限として使用されます。選択ボックスが変更されていない場合、下限は 1 で、上限は宣言した MAX_INT 変数です (ここで説明したように)。
サンプルコード:
transaction = db.transaction(["schaden"] , "readonly").objectStore("schaden");
index = transaction.index("compoundIndex");
// keyrange-arrays from another function
lowerBound = [valueOneLower, valueTwoLower, valueThreeLower];
upperBound = [valueOneUpper, valueTwoUpper, valueThreeUpper];
range = IDBKeyRange.bound( lowerBound, upperBound );
index.openCursor(range).onsuccess = function(e){
var cursor = e.target.result;
if (cursor){
if (getTextfield.length == 0){
console.log("Entry found: " + cursor.value.description + ". Object: " + JSON.stringify(cursor.value));
}else if (cursor.value.bezeichnung.indexOf(getTextfield) !== -1){
console.log("Entry found: " + cursor.value.description + ". Object: " + JSON.stringify(cursor.value));
};
cursor['continue']();
};
};
すべての選択ボックスにすべての値を設定すると、エントリを完全に検索できます。ただし、フィールドを開いたままにしておくと、検索が台無しになります。value1-select ボックスに触れておらず、他のボックスを 2 に設定すると、lowerBound = [1,2,2] と upperBound = [4294967295,2,2] が得られます。これにより、IDB のすべてのエントリが返されます。2 番目と 3 番目の値は考慮されません。
これは意図したものですか?または、これを回避する方法はありますか?私はこれについて何度も情報を探してきましたが、行き詰まっているようです。この API についての素朴な理解から、検索時にすべての配列フィールドが考慮されると信じるようになりました。私が使用するオブジェクトとそのためのインデックスは、上記の例よりもはるかに複雑であるため、複数のインデックスで検索を実行するのは非常に面倒です。
あなたの洞察に感謝します!
編集:最初のコメントの後にもう少し明確にするために。オブジェクト ストアに次のオブジェクトがあるとします。
obj1 { val1 = 1 , val2 = 3 , val3 = 1 }
obj2 { val1 = 1 , val2 = 2 , val3 = 2 }
obj3 { val1 = 2 , val2 = 1 , val3 = 3 }
obj4 { val1 = 1 , val2 = 1 , val3 = 1 }
obj5 { val1 = 1 , val2 = 2 , val3 = 3 }
インデックスは期待どおりに並べ替えます。
#1 [1,1,1] obj4
#2 [1,2,2] obj2
#3 [1,2,3] obj5
#4 [1,3,1] obj1
#5 [2,1,3] obj3
範囲 (lower[1,1,1] 、 upper[1,1,1]) を検索すると、obj4 が得られると仮定しましょう。これは、すべての選択ボックスでオプション 1 が選択されている場合の動作です。ここで、val1 = 1、val2 = 不明、および val3 = 1 のエントリを検索すると、次の範囲が得られます: lower[1,1,1] 、 upper[ 1,4294967295,1]。期待される結果は、obj4 [1,1,1] および obj1 [1,3,1] です。これらの代わりに、obj2 と obj5 の val3 はキー範囲と一致しませんが、結果は obj4、obj2、obj5、obj1 の 4 つのヒットを与えています。