Как реализовать облако тегов с помощью RethinkDB?

Предположим, у меня есть таблицы (с примерами данных):

 story
 {id: 1, name: 'First Story', tags: ['plants', 'flowers']}
 {id: 1, name: 'Second Story', tags: ['flowers', 'wedding']}

 tag
 {id: 'plants'}
 {id: 'flowers'}
 {id: 'weddings'}

Таблица истории имеет мультииндекс в поле тегов.

Теперь, как мне сделать запрос, который дает количество историй, которые есть у каждого тега (чтобы его можно было отобразить как облако тегов). Бывший:

 {"plants": 1, "flowers": 2, "wedding": 1}

или это может быть в формате:

 [{id: "plants", count: 1}, {id: "flowers", count: 2}, {id: "wedding", count: 1}]

И делать это эффективно, когда таблица с сотнями тысяч историй и сотнями тегов быстро выполнит запрос?


person Chanon    schedule 17.10.2014    source источник


Ответы (1)


r.table("story").indexCreate("tags", {multi: true}).run(...)
r.table("story").group({index: "tags"}).count().run(...)

Если вы хотите улучшить результат группы / подсчета, вы можете сделать

r.table("story").group({index: "tags"}).count().ungroup().map(function(result) {
  return r.object(result("group"), result("reduction"))
})
person neumino    schedule 17.10.2014
comment
r.table("story").group({index: "tags"}).count().run(...) работает нормально, но тот, у которого есть карта, приводит к Cannot convert NUMBER to SEQUENCE ошибке. - person Chanon; 19.10.2014
comment
Извините, я забыл позвонить ungroup. Я только что отредактировал запрос, теперь он должен работать нормально. - person neumino; 19.10.2014
comment
Я обнаружил, что с дополнительным уменьшением результат получается красивее (один объект вместо массива объектов): r.table("story").group({index: "tags"}).count().ungroup().map(function(result) { return r.object(result("group"), result("reduction")) }).reduce( function(left, right) {return left.merge(right)} ) - person Chanon; 20.10.2014