Команда ReQL: concat_map
Синтаксис команды
stream.concat_map(function) → stream array.concat_map(function) → array
Описание
Объединяет один или несколько элементов в одну последовательность с помощью функции отображения.
concat_map работает аналогично map, применяя заданную функцию к каждому элементу в последовательности, но всегда возвращает одну последовательность. Если функция отображения возвращает последовательность, map создаст последовательность последовательностей:
r.expr([1, 2, 3]).map { |x| [x, x.mul(2)] }.run(conn)
Результат:
[[1, 2], [2, 4], [3, 6]]
В то время как concat_map с той же функцией отображения объединит эти последовательности в одну:
r.expr([1, 2, 3]).concat_map { |x| [x, x.mul(2)] }.run(conn)
Результат:
[1, 2, 2, 4, 3, 6]
Значение возврата, массив или поток, будет иметь тот же тип, что и входные данные.
Пример: Создать последовательность всех монстров, побежденных героями Marvel. Поле “defeatedMonsters” — это массив из одного или нескольких имен монстров.
r.table('marvel').concat_map { |hero|
hero[:defeated_monsters]
}.run(conn)
Пример: Симулировать eq_join с помощью concat_map. (Так реализованы внутренние соединения ReQL.)
r.table('posts').concat_map { |post|
r.table('comments').get_all(
post['id'], :index => 'post_id'
).map { |comment| { :left => post, :right => comment} }
}.run(conn)
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/concat_map/