Ecto: Best way to update a map field, perserving existing values?

What is the best way to update or add a key to a map field - preserving existing key/values?

schema "authors" do
  field :additional_data, :map
end

Reading through the docs and googling around, it seems my options are:

  • Manually merge existing map with incoming map in my changeset.
  • Convert my map field to an embedded schema and update it that way.

Are there other options I’m missing?

Thanks!

If you use Postgres, then you can merge two jsonb objects on a database level using || operator:

select '{"a": 1, "b":2}'::jsonb || '{"b": 3, "c":4}'::jsonb

prints

{"a": 1, "b": 3, "c": 4}

In the end you’ll be merging the map somewhere. Ecto doesn’t have a concept of merging at the field value level.