2014-09-05 3 views
2

Предположим, у меня есть таблица статей с полем заголовка. Как я могу получить список статей, отсортированных по длине их названий?RethinkDB: Как упорядочить по длине поля строки?

ex. Статья:

{id: '101', title: 'A title', contents: 'Lots of text'} 

Я пробовал:

r.table('story').orderBy(function(doc){return r.row('title').length}).pluck('title') 

, но это неправильно.

ответ

5

Вы можете использовать split("").count() как произведение вокруг теперь

r.table("story").orderBy(function(doc) { 
    return doc("title").split("").count() 
}).pluck("title") 

https://github.com/rethinkdb/rethinkdb/issues/264 Смотрите, чтобы отслеживать прогресс в нативный методе, чтобы получить длину строки.

+0

Не работает так, как ожидалось, для строк UTF-8, содержащих символы не ASCII, такие как акценты или идеограммы CJK. Согласно https://github.com/rethinkdb/rethinkdb/issues/2518, исправление должно быть помещено в 2.1 или 2.2? –

0

Это было реализовано в RethinkDB 2.3, issue 4228.

Вы могли бы сделать что-то вроде

r.db('cms') 
    .table('story') 
    .map(doc => doc.merge({ 
    title_length: doc('title').default('').count() 
    })) 
    .orderBy(r.desc('title_length')); 

Однако, это очень неэффективно, так как каждый раз, когда он будет читать все документы, что является менее эффективным по сравнению с аналогичными реализациях SQL, который будет только читать один столбец, в то время как RethinkDB читает весь JSON.

Возможно, вы захотите сохранить длину заголовка внутри самих документов, если вы собираетесь часто его запрашивать.