Команда ReQL: ungroup
Синтаксис команды
grouped_stream.ungroup() → array grouped_data.ungroup() → array
Описание
Принимает сгруппированный поток или данные и преобразует их в массив объектов, представляющих группы. Любые команды, связанные после ungroup, будут работать с этим массивом, а не с каждой группой индивидуально. Это полезно, если, например, вы хотите отсортировать группы по значению их сокращения.
Формат массива, возвращаемого ungroup, такой же, как и стандартный родной формат сгруппированных данных в драйвере JavaScript и обозревателе данных.
Предположим, что таблица games содержит следующие данные:
[
{"id" => 2, "player" => "Bob", "points" => 15, "type" => "ranked"},
{"id" => 5, "player" => "Alice", "points" => 7, "type" => "free"},
{"id" => 11, "player" => "Bob", "points" => 10, "type" => "free"},
{"id" => 12, "player" => "Alice", "points" => 2, "type" => "free"}
]
Пример: Каково максимальное количество набранных очков каждым игроком, начиная с самых результативных?
r.table('games')
.group('player').max('points')['points']
.ungroup().order_by(r.desc('reduction')).run(conn)
Результат:
[
{
"group" => "Bob",
"reduction" => 15
},
{
"group" => "Alice",
"reduction" => 7
}
]
Пример: Выберите одного случайного игрока и все его игры.
r.table('games').group('player').ungroup().sample(1).run(conn)
Результат:
[
{
"group" => "Bob",
"reduction" => [
{"id" => 2, "player" => "Bob", "points" => 15, "type" => "ranked"},
{"id" => 11, "player" => "Bob", "points" => 10, "type" => "free"}
]
}
]
Обратите внимание, что если вы не вызвали ungroup, вы бы вместо этого выбрали одну случайную игру каждого игрока:
r.table('games').group('player').sample(1).run(conn)
Результат:
{
"Alice" => [
{"id" => 5, "player" => "Alice", "points" => 7, "type" => "free"}
],
"Bob" => [
{"id" => 11, "player" => "Bob", "points" => 10, "type" => "free"}
]
}
Пример: Нахождение арифметической моды массива значений:
r.expr([1,2,2,2,3,3]).group(){|row| row}.count().ungroup().order_by('reduction').nth(-1)['group'].run(conn)
Результат:
2
Пример: Типы!
r.table('games').group('player').type_of().run(conn) # Returns "GROUPED_STREAM"
r.table('games').group('player').ungroup().type_of().run(conn) # Returns "ARRAY"
r.table('games').group('player').avg('points').run(conn) # Returns "GROUPED_DATA"
r.table('games').group('player').avg('points').ungroup().run(conn) #Returns "ARRAY"
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/ungroup/