我在这里阅读有关Datomic pull语法的内容:
http://docs.datomic.com/pull.html
并且它在通配符下解释了像[*]
这样的模式将拉实体并递归拉取其实体属性。直接引用:
通配符规范*提取实体的所有属性,并递归地提取任何组件属性:
;; pattern
[*]
;; result
{:release/name "The Concert for Bangla Desh",
:release/artists [{:db/id 17592186049854}],
:release/country {:db/id 17592186045504},
:release/gid #uuid "f3bdff34-9a85-4adc-a014-922eef9cdaa5",
:release/day 20,
:release/status "Official",
:release/month 12,
:release/artistCredit "George Harrison",
:db/id 17592186072003,
:release/year 1971,
:release/media
[{:db/id 17592186072004,
:medium/format {:db/id 17592186045741},
:medium/position 1,
:medium/trackCount 2,
:medium/tracks
[{:db/id 17592186072005,
:track/duration 376000,
:track/name "George Harrison / Ravi Shankar Introduction",
:track/position 1,
:track/artists [{:db/id 17592186048829} {:db/id 17592186049854}]}
{:db/id 17592186072006,
:track/duration 979000,
:track/name "Bangla Dhun",
:track/position 2,
:track/artists [{:db/id 17592186048829}]}]}
...
]}
但是,当我自己尝试此操作时,我只会获得db/id
类型的ref
值。我必须在pull
表达式中以更冗长的方式调出任何ref类型,如下所示:
[* {:content/type [:db/ident] :content/locales [:db/ident] :content/groups [*]}]
这实际上并不是它的结尾,因为:content/groups
本身内部有ref
种类型。通配符的行为是否在某些时候发生了变化而且文档不是最新的?或者我做错了什么?是否有一种更好(更简洁)的方式去说,"只是递归地将它全部拉入"?
答案 0 :(得分:2)
pull表达式中的通配符仅填充组件属性。也就是说,架构中的:db/isComponent true
属性。
查看mbrainz schema,只有:release/media
和:medium/tracks
是组件属性,因此它们是唯一填充了[*]
拉模式的组件。
如果您的数据模型包含分层参考链(即:person/friend
作为对任何人的引用,也可能引用了朋友),您可以定义recursive pull patterns并指定其递归深度(或使用{ {1}}无限制。)
本主题也在Datomic Google Group上讨论,并包含一个示例递归拉模式的链接。