0

私はCouchbaseを初めて使用し、複合インデックスを取得して目的を達成するのに苦労しています。ユースケースは次のとおりです。

  • ドキュメントとして保存されている一連の「列挙」があります
  • それぞれに「last_updated」フィールドがあり、ご想像のとおり、フィールドが最後に更新された時刻が格納されます
  • 特定の日付以降に更新された列挙のみを表示できるようにしたいが、それでも列挙の名前でリストをソートしたい

次のような Couchbase ビューを作成しました。

function (doc, meta) {
   var time_array;
   if (doc.doc_type === "enum") {
      if (doc.last_updated) {
         time_array = doc.last_updated.split(/[- :]/);
      } else {
         time_array = [0,0,0,0,0,0];
   }
   for(var i=0; i<time_array.length; i++) { time_array[i] = parseInt(time_array[i], 10); }
   time_array.unshift(meta.id);
   emit(time_array, null);
}

}

last_updated フィールドが設定されていないため、時間フィールドがすべてゼロに設定されているレコードが 1 つあります。最初のテストとして、その結果を除外できると考え、次のように入力しました。

startkey = ["a",2012,0,0,0,0,0]
endkey = ["Z",2014,0,0,0,0,0]

リストは「id」でソートされていますが、何もフィルタリングしていません! 誰が私が間違っているのか教えてもらえますか? これらの結果を達成するためのより良い複合ビューはありますか?

4

1 に答える 1

1

カウチベースで startkey - endkey でビューをクエリすると、2 つ以上のプロパティで結果をフィルタリングできません。Couchbase にはインデックスが 1 つしかないため、最初のパラメーターのみで結果をフィルタリングします。したがって、クエリは次のクエリと同じになります。

startkey = ["a"]
endkey = ["Z"]

これらの日付でフィルタリングできない理由について、Filipe Manana による完全な回答へのリンクを次に示します。

ここからの引用は次のとおりです。

複合キー (配列) の場合、要素は左から右に比較され、要素が他のキーの対応する要素と異なるとすぐに比較が終了します (memcmp() または strcmp() で文字列を比較する場合と同じです)。 .

したがって、日付でフィルター処理するビューが必要な場合は、日付配列を複合キーの最初に配置する必要があります。

于 2013-06-13T06:28:30.363 に答える