script

script

I have this map:

               %{
                 "$include" => %{
                    "hospitals" => %{
                       "$include" => %{"rooms" => %{"beds" => %{}}},
                       "$order" => %{"id" => "$asc"}
                    },
                   "doctors" => %{
                       "$order" => %{"id" => "$desc"}                      
                    }
                 }
              }

There is any number of $include statements nested inside $include. so it should be dynamic. The output should be.

               %{
                 "$include" => %{
                    "hospitals" => %{
                       "$include" => %{"rooms" => %{"beds" => %{"binding" => "last"}, "binding" => "last"}},
                       "$order" => %{"id" => "$asc"},
                       "binding" => "first"
                    },
                   "doctors" => %{
                       "$order" => %{"id" => "$desc"},
                       "binding" => "first"
                    }
                 }
              }

All the outer maps should include binding => "first" and all nested include should contain "binding "=> "last".

Any help will be much appreciated.

Thanks

Showing Posts 1 to 6

Eiji

Eiji

@script Try this one:

defmodule Example do
  def sample(map) when is_map(map), do: map(map, false)

  defp do_sample(_key, value, _nested) when not is_map(value), do: value

  defp do_sample("$" <> _key, value, nested), do: map(value, nested)

  defp do_sample(_key, value, nested), do: value |> map(true) |> put_binding(nested)

  defp map(map, nested), do: :maps.map(&do_sample(&1, &2, nested), map)

  defp put_binding(map, false), do: Map.put_new(map, "binding", "first")
  defp put_binding(map, true), do: Map.put_new(map, "binding", "last")
end

Helpful resources:

  1. Map.put_new/3
  2. :maps.map/2
script

script OP

thanks a lot for your help. Can you please tweak it a little bit to support params which are not maps like this:

       "$include" => %{
         "fat_hospitals" => %{
           "$join" => "$full"
        }

it’s throwing error for join.

Also if the nested include is a list or a string like this:

                      opts = %{
                              "$include" => %{"hospitals" => %{"$include" => ["rooms"]}}
                               }

it should be like this:

                         opts = %{
                          "$include" => %{"hospitals" => %{"$include" => ["rooms"], "$binding" => "last"}}
                           }

Thanks again.

kokolegorille

kokolegorille

There is also get_and_update_in which can be helpful.

Eiji

Eiji

I have updated my response. Do you expect maps in lists too?

script

script OP

No just lists of strings or simple strings like this:

“$include” => “rooms”.

include contain three types of data structures:

“$include” → %{}
“$include” → [“rooms”, “beds”]
“$include” → “beds”

script

script OP

Thanks again for your help and time.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews