4

つまり、Couchbaseで私が理解していることは、次を使用してキーを並べ替えることができるということです*

descending=true

しかし、私の場合は、代わりに値で並べ替えたいと思います。json形式のTwitterデータを考えてみましょう。私の質問は、最も人気のあるユーザーが言及したものは何ですか?

各ツイートの構造は次のとおりです。

{
    "text": "",
    "entities" : {
        "hashtags" : [ ... ],
        "user_mentions" : [ ...],
        "urls" : [ ... ]
}

そのため、Map関数を再利用する前にMongoDBを使用し、Couchbaseで使用できるように少し変更しました。

function (doc, meta) {
  if (!doc.entities) { return; }

  doc.entities.user_mentions.forEach(
    function(mention) {
      if (mention.screen_name !== undefined) {
        emit(mention.screen_name, null);
      }
    }
  )
}

次に、reduce関数を使用してすべての発生_countをカウントしました。screen_name今私の問題は、キーではなくカウント値でソートするにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

簡単に言うと、表示した結果を値で並べ替えることはできません。キーでのみ並べ替えることができます。

いくつかの回避策は次のいずれかになります。

  • データをCouchbaseに挿入する前に分析し、関心のある値のカウンターを作成します(あなたの場合は言及)

  • ビューのサイズがクライアント側の並べ替えに受け入れられる場合は、アプリケーションのサイズで並べ替える必要のあるビューを使用します。

次のJSコードは、ビューを呼び出し、結果を並べ替えて、最もホットな10個のサブジェクト(ハッシュタグ)を出力します。

var http =  require('http');

var options = {
    host: '127.0.0.1',
    port: 8092,
    path: '/social/_design/dev_tags/_view/tags?full_set=true&connection_timeout=60000&group=true',
    method: 'GET'
}

http.request(
    options, 
    function(res) {
        var buf = new Buffer(0);
        res.on('data', function(data) {
            buf += data;
        });
        res.on('end', function() {
            var tweets = JSON.parse(buf);
            var rows = tweets.rows;
            rows.sort( function (a,b){ return b.value - a.value } 
            );


            for ( var i = 0;  i < 10; i++ ) {
                console.log( rows[i] );
            }
        });
    }
    ).end();

同時に、私はこれを達成するための他のオプションを検討しています

于 2012-11-11T12:03:39.707 に答える
1

複合キーを使用してこれを解決しました。

function (doc, meta) {
  emit([doc.constraint,doc.yoursortvalue]);
}

URL要素:

&startkey=["jim",5]&endkey=["jim",10]&descending=true
于 2014-03-17T20:48:42.287 に答える