【发布时间】:2022-02-11 23:46:47
【问题描述】:
我有一张桌子GateReportSubclass(嵌入)和GateReportEvent(交付)。一个GateReportSubclass可以有多个GateReportEvent比如
schema "deliveries" do
field(:cameraex, :string)
field(:arrived_at, :utc_datetime)
field(:left_at, :utc_datetime)
belongs_to(:embedding_in, GateReportSubclass, foreign_key: :embedding_id_in)
belongs_to(:embedding_out, GateReportSubclass, foreign_key: :embedding_id_out)
end
在GateReportSubclass
schema "embeddings" do
field(:cameraex, :string)
field(:embeddings, :map)
has_many(:in_deliveries, GateReportEvent, foreign_key: :embedding_id_in)
has_many(:out_deliveries, GateReportEvent, foreign_key: :embedding_id_out)
end
所以,在 deliveries 中,embedding_id_in/embedding_id_out 中可以有 embeddings 的 id。
我正在尝试使用arrived_at 或left_at 查询deliveries,以获取发生在特定日期事件的子类。
我有这个问题
GateReportSubclass
|> join(:left, [s], d in GateReportEvent,
on: d.embedding_id_in == s.id or d.embedding_id_out == s.id
)
|> where([s], s.cameraex == ^exid)
|> where(
query,
[s, d],
date_compare(^period, ^timezone, d.arrived_at, ^date) or
date_compare(^period, ^timezone, d.left_at, ^date)
)
|> preload([:in_deliveries, :out_deliveries])
|> distinct([s], s.id)
|> select([:id, :class, :subclass, :cameraex, :features])
现在这个查询一切正常。 但是
GateReportSubclass 可以出现在超过 10K 个GateReportEvents 中,例如
- GateReport 子类
- in_deliveries [10k GateReportEvent]
- out_deliveries [15k GateReportEvent]
在这种情况下查询很慢。我也想得到in_deliveries 和out_deliveries 的总和。为此,我正在这样做
subclasses =
data.items
|> Enum.reduce([], fn subclass, acc ->
%{in_deliveries: in_deliveries, out_deliveries: out_deliveries} = subclass
occurances = Enum.count(in_deliveries) + Enum.count(out_deliveries)
elem = subclass |> Map.from_struct() |> Map.put(:occurances, occurances)
[acc | [elem]]
end)
|> List.flatten()
我想避免这个preload,但也想计算总进出事件的数量。你能指导我吗,我希望我解释得很好。提前致谢
Map.put(data, :items, subclasses)
【问题讨论】: