Многоуровневая группировка Rethinkdb

Скажем, у меня есть таблица с такими документами, как:

{
  "country": 1,
  "merchant": 2
  "product": 123,
  ...
}

Можно ли сгруппировать все документы в окончательную структуру json, например:

[
  {
    <country_id>: {
      <merchant_id>: {
        <product_id>: <# docs with this product id/merchant_id/country_id>,
        ... (other product_id and so on)
      },
      ... (other merchant_id_id and so on)
  },
  ... (other country_id and so on)
]

И если да, то как лучше и эффективнее? У меня этих документов больше миллиона, на 4-х шардах с мощными серверами (кэш по 22 Гб каждый)

Я пробовал это (в проводнике данных, в JS, на данный момент):

r.db('foo')
  .table('bar')
  .indexCreate('test1', function(d){
    return [d('country'), d('merchant'), d('product')]
  })

а потом

r.db('foo')
  .table('bar')
  .group({index: 'test1'})

Но проводник данных, кажется, завис, все еще работая над ним, как вы можете видеть...


person DevLounge    schedule 19.12.2015    source источник


Ответы (1)


.group({index: 'test1'}).count() сделает что-то очень похожее на то, что вы хотите, за исключением того, что он не создаст вложенную структуру документа. Чтобы создать вложенную структуру документа, вероятно, было бы проще всего ungroup, затем отобразить разгруппированные значения для создания объектов желаемой формы, а затем merge всех их.

Однако проблема с запросами group для всей таблицы заключается в том, что они не будут передаваться в потоковом режиме, вам нужно будет пройти всю таблицу, чтобы получить конечный результат. Проводник данных предназначен для небольших запросов, и я думаю, что время ожидания истекает, если ваш запрос занимает более 5 минут, поэтому, если вы просматриваете гигантскую таблицу, вероятно, было бы лучше запустить этот запрос с одного из клиентов. .

person mlucy    schedule 20.12.2015