Как вы сортируете результаты _View_ по значению в Couchbase?

Итак, из того, что я понимаю в Couchbase, можно сортировать ключи*, используя

descending=true

но в моем случае я хочу вместо этого сортировать по значениям. Рассмотрим данные Twitter в формате json. Мой вопрос: Что упомянул самый популярный пользователь?

Каждый твит имеет структуру:

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

Поэтому, используя MongoDB до того, как я повторно использовал функцию Map и немного изменил ее, чтобы ее можно было использовать в 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);
      }
    }
  )
}

Затем я использовал функцию сокращения _count для подсчета всех screen_name вхождений. Теперь моя проблема заключается в следующем: Как мне сортировать по значениям счетчика, а не по ключу?

Спасибо


person chutsu    schedule 08.11.2012    source источник


Ответы (2)


Короткий ответ: вы не можете сортировать по значению результат просмотра. Вы можете сортировать только по ключу.

Некоторая работа будет заключаться в следующем:

  • проанализируйте данные перед их вставкой в ​​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();

В то же время я ищу другие варианты для достижения этого

person Tug Grall    schedule 11.11.2012
comment
Хммм, я очень неохотно принимаю этот ответ, хотя я знаю, что вы не можете сортировать по значению, я думаю, что это проблема, которая в конечном итоге будет решена разработчиками диванной базы, поэтому для долговечности этого вопроса... - person chutsu; 15.11.2012
comment
@chutsu, ответ, который я дал, относится к Couchbase 2.0 (и вы правы, в будущем продукте Couchbase, вероятно, предоставит способ добиться этого) Вопрос Павла является классическим при работе с представлением Couchbase, поэтому я хотел уточнить . - person Tug Grall; 16.11.2012
comment
Вопрос Павла классический, вы имеете в виду мой вопрос? :п - person chutsu; 16.11.2012
comment
Я использую 2.2 и все та же проблема, кто-нибудь решил эту проблему? - person Prakash Thapa; 23.01.2014

Я решил это, используя составной ключ.

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

элементы URL:

&startkey=["jim",5]&endkey=["jim",10]&descending=true
person enko    schedule 17.03.2014