6

ここで何年も読んだ後、ついに登録して質問をしました。私は最近 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 つのヒットを与えています。

4

2 に答える 2

1

その場合は、別の複合インデックスが必要です。

または、 YDN-DB - SortedMerge で混合データ型を使用した誤った結果で説明されているように、キー結合を使用することもできます

于 2014-05-22T13:53:42.150 に答える