12

カウチデータベースで「トップ10を選択」に相当するクエリを実行するにはどうすればよいですか?

たとえば、次のような「スキーマ」があります。

title   body   modified

最後に変更された 10 個のドキュメントを選択したいと思います。

カテゴリごとにのみ同じことを行う方法を誰かが思いつくことができれば、追加のボーナスとして。だから:

title   category   body   modified

各カテゴリの最新の 10 個のドキュメントのリストを返します。

そのようなクエリがcouchdbで可能かどうか疑問に思っています.

4

3 に答える 3

7

データベースから最初の 10 個のドキュメントを取得するには、 limit クエリ オプションを使用できます。例:通話

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10

最初の 10 個のドキュメントを取得します。

ビューの行はキーでソートされます。クエリ文字列に descending=true を追加すると、順序が逆になります。関心のあるキーを選択するためにクエリ文字列を再度使用して、関心のあるドキュメントのみを発行することもできます。したがって、ビューでは、マップ関数を次のように記述します。

function(doc) {
    emit([doc.category, doc.modified], doc);
}

そして、次のようにクエリします。

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true
于 2010-04-06T08:56:16.890 に答える
3

これがあなたがする必要があることです。

マップ機能

function(doc)
{
  if (doc.category)
  {
    emit(['category', doc.category], doc.modified);
  }
}

次に、それらをグループ化するリスト関数が必要です.reduceを悪用してこれを実行したくなるかもしれませんが、大量のデータセットで十分に速く減少しないため、おそらくエラーがスローされます.

function(head, req)
{
  % this sort function assumes that modifed is a number
  % and it sorts in descending order
  function sortCategory(a,b) { b.value - a.value; }
  var categories = {};
  var category;
  var id;
  var row;
  while (row = getRow())
  {
    if (!categories[row.key[0]])
    {
      categories[row.key[0]] = [];
    }
    categories[row.key[0]].push(row);
  }
  for (var cat in categories)
  {
    categories[cat].sort(sortCategory);
    categories[cat] = categories[cat].slice(0,10);
  }
  send(toJSON(categories));  
}

今すぐすべてのカテゴリのトップ 10 を取得できます

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories

そしてドキュメントを入手してください

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true

これで、複数の範囲の POST でこれをクエリし、カテゴリを制限できます

curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'

をハードコーディングして、変数10を介して数値を渡すこともできません。req

これは、ビュー/リストのトリックです。

于 2010-04-20T04:35:19.480 に答える
0

微修正。sortCategory 関数に「return」キーワードを追加するまで、ソートされていませんでした。次のようになります。

function sortCategory(a,b) { return b.value - a.value; }
于 2012-04-04T22:25:53.220 に答える