Команда ReQL: merge
Синтаксис команды
singleSelection.merge([object | function, object | function, ...]) → object object.merge([object | function, object | function, ...]) → object sequence.merge([object | function, object | function, ...]) → stream array.merge([object | function, object | function, ...]) → array
Описание
Объединяет два или более объектов, создавая новый объект со свойствами из всех исходных. При конфликте имён полей предпочтение отдаётся полям из правого объекта в списке аргументов. merge также принимает функцию подзапроса, возвращающую объект, который будет использоваться аналогично функции map.
Пример: Экипировать Тора для битвы.
r.table('marvel').get('thor').merge(
r.table('equipment').get('hammer'),
r.table('equipment').get('pimento_sandwich')
).run(conn)
Пример: Экипировать каждого героя для битвы, используя функцию подзапроса для получения их оружия.
r.table('marvel').merge{ |hero|
{ :weapons => r.table('weapons').get(hero['weapon_id']) }
}.run(conn)
Пример: Использовать merge для объединения каждого поста с его комментариями.
Обратите внимание, что последовательность, которую нужно объединить (в данном примере, комментарии), должна быть преобразована из выбора в массив. Без coerce_to операция выбросит ошибку («Ожидаемый тип DATUM, но получен SELECTION»).
r.table('posts').merge{ |post|
{ :comments => r.table('comments').get_all(post['id'],
{:index => 'post_id'}).coerce_to('array') }
}.run(conn)
Пример: Merge может использоваться рекурсивно для изменения объектов внутри объектов.
r.expr({:weapons => {:spectacular_graviton_beam => {:dmg => 10, :cooldown => 20}}}).merge(
{:weapons => {:spectacular_graviton_beam => {:dmg => 10}}}
).run(conn)
Пример: Для замены вложенного объекта другим объектом можно использовать ключевое слово literal.
r.expr({:weapons => {:spectacular_graviton_beam => {:dmg => 10, :cooldown => 20}}}).merge(
{:weapons => r.literal({:repulsor_rays => {:dmg => 3, :cooldown => 0}})}
).run(conn)
Пример: Literal также может использоваться для удаления ключей из объекта.
r.expr({:weapons => {:spectacular_graviton_beam => {:dmg => 10, :cooldown => 20}}}).merge(
{:weapons => {:spectacular_graviton_beam => r.literal()}}
).run(conn)
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/merge/