3

私は156個のjsonドキュメントを含むcouchdbデータベースを持っています。ドキュメント内の特定の値の最大値を見つけて、その最大値を含むドキュメント全体を出力したいと考えています。このコードを使用しましたが、うまくいかないようです。これは、私の言いたいことを理解するのに役立つかもしれません。

function(doc) {
    var i,m;
    for (i = 0; i < doc.watchers.length; i++)
        m = Math.max(m,doc.watchers[i]);
        for (i = 0; i < doc.watchers.length; i++)
            if (m = doc.watchers[i])
                emit(doc.watchers[i], doc.watchers);
}

また、最大値を持つ上位 2 つのドキュメントを選択したいと思います。

4

1 に答える 1

0

map / reduceが機能する方法では、キーと値の完全なセットを同時にmap関数で使用できないため、map関数を使用するだけでは機能しません。そのためにreduce関数を使用します。このようなもの:

マップ機能

function(doc) {
  var i,m;
  for (i = 0; i < doc.watchers.length; i++) {
    emit([doc._id, doc.watchers[i]], doc.watchers);
  }
}

機能を減らす

function(keys, values) {
  var top=0;
  var index=0;
  for (i=0;i<keys.length;i++) {
    if (keys[i][1] > top) {
      top = keys[i][1];
      index = i;
    }
  }
  return({keys[index], values[index]})
}

この戦略を機能させるには、group_level = 1を使用してクエリを実行する必要があります。これにより、couchはドキュメントIDでグループ化された結果をmap関数に渡します。私はこのソリューションをテストしていませんが、2番目の質問はまだ解決していません。あなたがそれが正しい方向に進むと思うなら、私はそれを洗練することができます。

于 2012-11-26T10:18:32.097 に答える