所以基本上我有一个订单列表,一个订单提供商列表和一个用户列表 每个订单都有一个属性:order / subscribers,它是零个或多个订阅者的向量。 我想得到订单的订户数量。
下面的查询仅给出了包含1个或更多订阅者的订单,但也需要订阅0个订阅者
基本上我得到了这个:
([4 "Provider1" "images/p1-logo.png" "orange" #inst "1970-01-01T00:00:00.000-00:00" 2]
[7 "Provider2" "images/p2-logo.png" "red" #inst "1970-01-01T00:00:00.001-00:00" 1])
想得到这个:
([4 "Provider1" "images/p1-logo.png" "orange" #inst "1970-01-01T00:00:00.000-00:00" 2]
[7 "Provider2" "images/p2-logo.png" "red" #inst "1970-01-01T00:00:00.001-00:00" 1]
[8 "Provider3" "images/p3-logo.png" "green" #inst "1970-01-01T00:00:00.001-00:00" 0])
这是我正在使用的查询和架构。
不确定我是否应该添加一些样本数据。
[:find ?ord ?name ?image ?color ?deadline (count ?subscribers)
:where [?ord :order/provider ?pid]
[?pid :provider/name ?name]
[?pid :provider/image-url ?image]
[?pid :provider/color ?color]
[?ord :order/deadline ?deadline]
[?ord :order/subscribers ?subscribers]]
(def schema {:order/provider {:db/valueType :db.type/ref}
:order/subscribers {:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many}})
提前干杯和Thx:)
答案 0 :(得分:2)
您需要使用函数来获取属性值。这里,get-else
获取属性值(:db.cardinality/many
的情况下的集合),然后使用第二个函数来获取计数。请注意,count
fn作为附加输入传递。另请注意,:find
中的计数是完全不同的野兽 - 它是数据记录引擎的聚合指令,但我们输入的count
只是常规的Clojure count
。
(d/q '[:find ?ord ?name ?image ?color ?deadline ?sc
:in $ ?count
:where [?ord :order/provider ?pid]
[?pid :provider/name ?name]
[?pid :provider/image-url ?image]
[?pid :provider/color ?color]
[?ord :order/deadline ?deadline]
[(get-else $ ?ord :order/subscribers nil) ?subscribers]
[(?count ?subscribers) ?sc]]
db count)
或者,您可以直接传入属性获取和计数的fn:
(d/q '[:find ?ord ?name ?image ?color ?deadline ?sc
:in $ ?subscribers-count
:where [?ord :order/provider ?pid]
[?pid :provider/name ?name]
[?pid :provider/image-url ?image]
[?pid :provider/color ?color]
[?ord :order/deadline ?deadline]
[(?subscribers-count $ ?ord) ?sc]]
db (fn [db ord] (count (:order/subscribers (d/entity db ord)))))
希望有所帮助!