0

私は大量のドキュメントのコレクションを持っており、それぞれがさまざまな日数の間有効です。範囲は1週間から1年までです。特定の日に有効なすべてのドキュメントを取得できるようにしたい。

どうすればいいですか?

例として、次の2つのドキュメントがあるとします。

doc1 = {
  // 1 year ago to today
  start_at: "2012-03-22T00:00:00Z",
  end_at: "2013-03-22T00:00:00Z"
}

doc2 = {
  // 2 months ago to today
  start_at: "2012-01-22T00:00:00Z",
  end_at: "2013-03-22T00:00:00Z"
}

そしてマップ関数:

(doc) ->
  emit([doc.start_at, doc.end_at], null)

したがって、6か月前の日付では、doc1のみを取得し、1週間前の日付では、両方のドキュメントを取得し、明日の日付では、ドキュメントを受信しません。

実際の解決は、要求が行われる秒まで下がる必要があり、ドキュメントがたくさんあるため、有効な秒ごとにキーを発行する戦略は適切ではないことに注意してください。

4

2 に答える 2

1

範囲内の毎日の発行を呼び出すことができ、特定の日に利用可能なドキュメントを簡単に選択できます。

function(doc) {
    var day = new Date(doc.start),
        end = new Date(doc.end).getTime();

    do {
        emit(day);
        day = new Date(day.getFullYear(), day.getMonth(), day.getDate() + 1);
    } while (day.getTime() <= end);
}

ドキュメントがたくさんある場合でも、emitの値の部分(2番目のパラメーター)を省略すると、インデックスは可能な限り小さくなります。

より洗練されたものにする必要がある場合は、couchdb-luceneを試すことができます。日付フィールドを日付オブジェクトとしてインデックス付けし、1つのリクエストで複数のフィールドを使用して範囲クエリを実行できます。

于 2013-03-22T22:14:58.623 に答える
0

この問題を、位置の計算幾何学の問題に変換できます。[x,y]=[start_at,end_at]日付で有効な2次元平面クエリのドキュメントの場合、 ()と( )でdate囲まれた長方形内のポイントのリストです。left=-infinity, right=datestart_at<datebottom=date, top=infinityend_at>date

残念ながら、CouchDBチームは計算幾何学の能力を過小評価しており、多次元クエリをサポートしていません。この種のクエリを次のように簡単に実行できるGeoCouch拡張機能があります。

http://localhost:5984/places/_design/main/_spatial/points?bbox=0,0,180,90

空間値を放出するビュー:

emit({ type: "Point", coordinates: [doc.start_at, doc.end_at] }, doc);

問題はデータ型が異なることです。の範囲でfloatを取得[-180.0,180.0]/[-90.0,90.0]し、少なくともint(UNIX時間形式)が必要です。GeoCouchがそれよりも広い範囲で機能し180.0、地理計算用に設計された浮動小数点演算の精度が秒の精度の日付に対して十分である場合、問題は解決されます:)いくつかのトリックとハックで、この問題を効率的に解決できると確信しています。地理ソフトウェア。GeoCouchでない場合は、おそらくElastiSearch(多次元クエリもサポート)は、Riverプラグインシステムを備えたCouchDBで簡単に使用できます。

于 2013-03-23T12:35:37.220 に答える