1

假设我有一个看起来像这样的数据 -

Author (id: 5) {
 name: "Mercy",
 blogs: [1, 2]
}

Blog (id: 1) {
 title: "Hello blog"
}

Blog (id: 2) {
 title: "Hello blog second"
}

我想按姓名查找作者以及他们博客的所有标题和博客数。到目前为止,我有

[:find ?blogs ?c
 :where
 [?e :name "Mercy"]
 [?e :blogs ?blogs]
 [(count ?blogs) ?c]
]

我只能获得博客的总数。如何仅使用数据日志查询来获取博客的标题?我也不能在博客实体上拥有 belongs_to 关系。

更新

“作者/博客”的架构如下所示:

{
 :db/ident :blog
 :db/valueType :db.type/ref
 :db/cardinality :db.cardinality/many    
}
4

2 回答 2

1

只是

[:find ?e (count ?b)
 :where
 [?e :name "Mercy"]
 [?e :blogs ?b]]

即使您删除作者的姓名也可以使用,然后您将获得作者的“地图”→博客计数

[:find ?e ?n (count ?b)
 :where
 [?e :name ?n]
 [?e :blogs ?b]]

不要忘记这些查询的有效工作:name应该被索引(:db/index true在模式中)。

但如果问题就这么简单,我建议通过实体 API 真的应该更有效:

(-> (d/entity db [:name "Mary"])
    (:blogs)
    (count))

要使 ref 查找工作 ( (d/entity db [:name "Mary"])),您需要:name在模式中指定为唯一属性

于 2017-08-11T10:29:12.550 回答
1

提取实体的所有属性后,您可以:title从实体中检索 :

[:find [(pull ?blogs '[:title]) ...] ?count
 :where
 [?e :name "Mercy"]
 [?e :blogs ?blogs]
 [(count ?blogs) ?count]

让我知道它是否有效。

于 2017-08-10T14:24:15.573 回答