2017-01-11 8 views
0

私はcouchdbを新しくしています。私はdocsとSOの投稿を見ましたが、何らかの理由でこの単純なクエリがまだ私を逃しています。ソート順を維持しながら日付でCouchdbを照会

SELECT TOP 10 * FROM x WHERE DATE BETWEEN startdate AND enddate ORDER BY score 

UPDATE:それはを行うことはできません。このタイプのデータは のデータを取得するためには、数百万のレコード(いくつかの フィールド)をソファから取り除き、フィルタリング、並べ替え、または制限を行い、希望の結果を得る必要があります。私は オリジナルの解決策_changesを使って、そのクエリを実行するために必要なデータを他の場所に取り込んで保存することに戻ります。ここで

更新ビュー(ドミニクのおかげで)です:私がする必要がどのような

emit([d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score], doc.name); 

は次のとおりです。

  • が常に並べ替えによって
  • 必要に応じてフィルタを降順スコア期間(たとえば、TODAYのみ)
  • 制限数x

更新:ドミニクのおかげで、私ははるかに近いだ - まだ 問題を持ちます。

?startkey=[2017,1,13,{}]&endkey=[2017,1,10]&descending=true&limit=10&include_docs=true 

これは

答えて

2
私は関係なく、日付のトップ10をしたいならば、私は日付のみ(とないスコア)でソートされたトップ10を取り戻すしかしスコア

によって並べ替えの日付の間の文書を戻します

まず、CouchDBで複雑なキーを使用する場合、だけを左から右にソートできます。これはよくある誤解ですが、詳細についてはViews Collationをお読みください。あなたがスコアでソートすることができるようにしたい場合は

が、フィルタ日付のみで(あなたはそれでいる間、同様にあなたが始めるしているので、全体Guide to Viewsを読んで)、あなたが壊すことによって、これを達成することができますあなたの気になる程度だけを表示するようにあなたのタイムスタンプを下げてください。

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score ]) 
} 

あなたが現在持っているものよりも複雑なキーを出力してしまいますが、あなたはそうのようにそれを照会:これは2017年1月1日にすべての文書を選び出します

startkey=[2017,1,1]&endkey=[2017,1,1,{}] 

すでにスコアでソートされています!あなたのビューで値として全体docを発する避けるため、余談として

(昇順に、単純に、降順取得するために必要なビューへの変更をstartkeyendkeyを交換しません)。 include_docs=trueパラメータを利用し、emitの値を空のままにする方が効率的です。(詳細はthis SO questionを参照してください)

この正確な設定では、さまざまな精度でクエリを実行するには、別々のビューが必要です。たとえば、月ごとにクエリを実行するには、年/月などを使用します。

ただし、アプリケーションでスコアを並べ替えることができれば、単一のビューを使用して必要なすべての日付精度を取得できます。たとえば、次のように私が述べたように、このビューとgroup_levelパラメータで

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHour(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() ]) 
} 

、あなたが年、月、日、時間、などにより全てのスコアを取得することができ、この場合はスコア順にソートされることはありませんまだ、しかし、これはあなたに他のクエリを開きます。 (例:今月にどのユーザーが参加しましたか)

+0

ドミニク、ありがとう、私は今これを試しています。 私は実際にドキュメントを保管していませんでしたが、新しくサブセット(8つの小道具を含む)を作成しました(つまり、{Name:doc.prop.name、...} - include_docs =あなたの頭の上から知っているように私は測定することができますが、音が聞こえます:-) – schmoopy

+0

また、その制限を見つけた後で私の質問を更新しました – schmoopy

+0

私はあまりにもすぐに話をしましたが、私は限界を追加すると、右の並べ替えのため正しく動作しません。私は私の質問を更新しました。 100回目のコメント、すべての更新で申し訳ありません) – schmoopy

関連する問題