mongodb_ecto icon indicating copy to clipboard operation
mongodb_ecto copied to clipboard

How to query on embed field?

Open AlexKovalevych opened this issue 8 years ago • 2 comments

Having such schema:

# ProjectUser module

schema "project_users" do
    belongs_to :project, Project

    embeds_many :stats, ProjectUserStat, on_replace: :delete
end
# ProjectUserStat module

  embedded_schema do
    field :date, :string
  end

Tried

      ProjectUser
      |> where([pu], pu.project_id in ^project_ids)
      |> where([pu], pu.stats.date >= ^from)

doesnt work:

** (Ecto.Query.CompileError) `pu.stats().date()` is not a valid query expression

tried with fragments:

      ProjectUser
      |> where([pu], pu.project_id in ^project_ids)
      |> where([pu], fragment("stats.date": ["$gte": ^from, "$lte": ^to]))

doesnt work:

[["stats.date": ["$gte": #BSON.ObjectId<5874d284958c27e7ccd906c3>, "$lte": #BSON.ObjectId<5874d284958c27e7ccd906c4>]]

Instead of having strings it converts them to ObjectIds. I'm using ecto 2.0 with this fork https://github.com/michalmuskala/mongodb_ecto/pull/91, so this might be related to that version only, anyway, any ideas?

AlexKovalevych avatar Jan 12 '17 10:01 AlexKovalevych

After debugging, the solution is to use fragment first and in query after, so this one works:

      ProjectUser
      |> where([pu], fragment("stats.date": ["$gte": ^from, "$lte": ^to]))
      |> where([pu], pu.project_id in ^project_ids)

For some reason it uses wrong arguments position if i do it opposite.

AlexKovalevych avatar Jan 12 '17 10:01 AlexKovalevych

The ordering is definitely a bug.

michalmuskala avatar Jan 13 '17 01:01 michalmuskala