2

この質問がどのように聞こえるかはわかりませんが、とにかくバット信号を捨てると思いました...次のようなデータセットがあります:

[
    { name: "Peter", score: 1000 },
    { name: "James", score: 800 },
    { name: "John", score: 600 },
    { name: "Saul", score: 400 },
    { name: "David", score: 200 }
]

このコレクションでやりたいことがいくつかありますが、主な機能は、特定のレコードを取得して、スコア テーブル内のそのアイテムのすぐ上と下にあるドキュメントを見つけることです。 ;

[
    { name: "James", score: 800 },
    -> { name: "John", score: 600 },
    { name: "Saul", score: 400 }
]

また、次のようなビューを作成したいと思います。

[
    { key: 1, value: { name: "Peter", score: 1000 } },
    { key: 2, value: { name: "James", score: 800 } },
    { key: 3, value: { name: "John", score: 600 } },
    { key: 4, value: { name: "Saul", score: 400 } },
    { key: 5, value: { name: "David", score: 200 } }
]

2つの問題が関連しているように感じずにはいられません。また、できるだけ少ない数の REST リクエストで「抜き取り」を実行したいと考えています...

アプリケーション層に依存するソリューションも喜んで受け入れますが、繰り返しになりますが、DB への複数回のアクセスは避けたいと思います。また、必要以上のデータを引き出すことも避けたいと考えています。

何か案は?

4

3 に答える 3

1

スコアをキーとするビューを作成できます。map 関数は do を実行するだけで済みますemit(doc.score, null)。ここで、doc は関数に渡されるドキュメントです。startkey=600limit=2、およびを使用してこのビューをクエリするdescending=falseと、スコアが 600 および 800 のドキュメントが取得されます。startkey=600limit=2およびを使用してクエリを実行するとdescending=true、スコアが 600 および 400 のドキュメントが取得されます。

すべてのドキュメントをスコアの降順で取得するには、decending=true を使用してクエリを実行し、他のパラメーターは使用しません。もちろん、フィールドを取得することはできませんがkey: n、アプリケーション層に簡単に追加できます。

于 2013-09-18T10:54:55.357 に答える
1

スコアをキーとして使用しようとしましたか? この場合、評価チャートを作成し、ある範囲のスコアを持つ人物を照会できます。あなたの地図機能:

function(doc){
    emit(doc.score, {'name': doc.name, 'score': doc.score})
}

// そのような値がまだ必要かどうかわからない

ここで、ビューを呼び出すと、次を受け取ります。

{
  "total_rows": 5, "offset": 0, "rows": [
    {"id": "1", "key": 200, "value": {"name": "David", "score": 200}},
    {"id": "2", "key": 400, "value": {"name": "Saul", "score": 400}},
    {"id": "3", "key": 600, "value": {"name": "John", "score": 600}},
    {"id": "4", "key": 800, "value": {"name": "James", "score": 800}},
    {"id": "5", "key": 1000, "value": {"name": "Peter", "score": 1000}}
  ]
}

トップ評価ではないようです。descending=trueクエリ パラメータを追加しましょう。

{"total_rows": 5, "offset": 0, "rows": [
  {"id": "5", "key": 1000, "value": {"name": "Peter", "score": 1000}},
  {"id": "4", "key": 800, "value": {"name": "James", "score": 800}},
  {"id": "3", "key": 600, "value": {"name": "John", "score": 600}},
  {"id": "2", "key": 400, "value": {"name": "Saul", "score": 400}},
  {"id": "1", "key": 200, "value": {"name": "David", "score": 200}}
]}

良い!startkey/endkeyクエリ パラメータを適用して、指定した範囲内のものをクエリできるようになりました。取りましょうstartkey=799&endkey=401。応答に境界線の値が含まれていることに注意してください。

{"total_rows":5,"offset":2,"rows":[
  {"id":"3","key":600,"value":{"name":"John","score":600}}
]}

結果のクエリは次のようになりますhttp://localhost:5984/db/_design/ddoc/_view/by_score?descending=true&startkey=799&endkey=401

于 2013-09-18T11:00:08.510 に答える
-1

データセットの軽量ビューを作成すると思います(KxepalとKimが提案するように、emit( "score"、null))それを引き出し、キャッシュし、変更フィードを使用して最新に保ちます。

そうすれば、データベースへのアクセスが少なくなります。これにより、キャッシュされたオブジェクトのプロパティ/要素に「ランク」プロパティを明示的に追加し、それを使用してチェリーピックすることができるため、「摘み取り」プロセスが何らかの形で簡単になります。

アップデート:

上記は解決策として機能する可能性がありますが (Redis の使用例ですか?)、ビュー応答の total_rows とオフセット値を使用すると、ドキュメントの「ランク」の取得が簡単になります (上記の 2 つの回答で示唆されているように、「スコア」ビューに基づく) )...

まだ残っている唯一の問題は、「引き抜き」自体です。これには、2 つの個別の API 呼び出しが必要になる場合がありますが、それほど悪くはないかもしれません...

ただし、提案はまだ受け付けています。

乾杯。:)

于 2013-09-18T11:57:35.320 に答える