jamesaspinwall

jamesaspinwall

Issue generating a JSONB query with @>

I am having an issue with a JSONB query.
This works:

Repo.all from r in Review,
where: fragment(~s(review @> '{"product": {"category": "Fitness"}}'))

SQL generated:

WHERE (review @> '{"product": {"category": "Fitness"}}')

But this doesn’t

Repo.all from r in Review,
where: fragment(~s(review @> '{"product": {"category": ?}}'),"Fitness")

SQL generated

WHERE (review @> '{"product": {"category": 'Fitness'}}')

Notice the single and double quotes between the SQL generated.
How can I cast the value to double nstead of single quotes?

Marked As Solved

jamesaspinwall

jamesaspinwall

I think I solved my issue. I can use the map type itself.

p = %{product: %{category: "Fitness & Yoga"}}
Repo.all from r in Review, 
where: fragment("review @> ? ", ^p)

Beautiful and simple code.

Also Liked

OvermindDL1

OvermindDL1

Actually the problem here is that the ? is being put inside of a value instead of ‘being’ the value itself, and Ecto doesn’t support that. Rather you’d need to do something like build the json out of the query and put it in en-masse, something like:

where: fragment(~s(review @> ?), Jason.to_string_or_whatever!(%{product: %{category: "Fitness"}})

Or so.

jamesaspinwall

jamesaspinwall

This works:

Repo.all from r in Review, 
where: fragment(~s(review @> ?), ~s({"product": {"category": "Fitness & Yoga"}}))

generates:

WHERE (review @> '{"product": {"category": "Fitness & Yoga"}}') []

returns a list of structs

The second:

p = ~s({"product": {"category": "Fitness & Yoga"}})
Repo.all from r in Review, 
where: fragment(~s(review @> ?), ^p)

generates an SQL:

WHERE (review @> $1) ["{\"product\": {\"category\": \"Fitness & Yoga\"}}"]

returns empty list

Your suggestion

p = ~s({"product": {"category": "Fitness & Yoga"}})
Repo.all from r in Review, 
where: fragment(~s(review @> ?::jsonb), ^p)

generates:

WHERE (review @> $1::jsonb) ["{\"product\": {\"category\": \"Fitness & Yoga\"}}"]

returns empty result as the second.

jamesaspinwall

jamesaspinwall

For those interested in the jsonb performance:

debug] QUERY OK source="reviews" db=1.0ms
SELECT r0."id", r0."review" FROM "reviews" AS r0 WHERE (review @> $1 
) [%{product: %{category: "Fitness & Yoga"}}]

The table contains almost 600,000 records.
The typical review looks like:

%Review{
__meta__: #Ecto.Schema.Metadata<:loaded, "reviews">,
id: 398313,
review: %{
  "customer_id" => "A2VK03UD8VHFTT",
  "product" => %{
    "category" => "Fitness & Yoga",
    "group" => "DVD",
    "id" => "B00005T30Y",
    "sales_rank" => 22142,
    "similar_ids" => ["B00004U2MW", "006016848X", "B0007R4T3U",
     "B0002OXVBO"],
    "subcategory" => "General",
    "title" => "Men Are from Mars, Women Are from Venus"
  },
  "review" => %{
    "date" => "1998-09-15",
    "helpful_votes" => 6,
    "rating" => 5,
    "votes" => 6
  }
}
}

Last Post!

OvermindDL1

OvermindDL1

@jamesaspinwall You should mark your ‘map’ post as the solution post so others can find it faster in the future, that’s a very useful nugget of info. :slight_smile:

Where Next?

Popular in Questions Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 130579 1222
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54092 488
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42576 114
New

We're in Beta

About us Mission Statement