数据拉取表达式
Datomic pull expression
我在这里阅读有关 Datomic 拉语法的信息:
http://docs.datomic.com/pull.html
它在通配符下解释说,像 [*]
这样的模式将拉取一个实体并递归地拉取其实体属性。直接引用:
The wildcard specification * pulls all attributes of an entity, and recursively pulls any component attributes:
;; 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}]}]}
...
]}
但是,当我自己尝试时,我只得到 ref
类型的 db/id
值。我基本上必须在 pull
表达式中以更详细的方式调用任何 ref 类型,如下所示:
[* {:content/type [:db/ident] :content/locales [:db/ident] :content/groups [*]}]
这甚至还没有结束,因为 :content/groups
本身就有 ref
类型。通配符的行为是否在某些时候发生了变化并且文档不是最新的?还是我做错了什么?有没有更好(更简洁)的方式来表达 "just recursively pull it all in"?
拉表达式中的通配符仅填充组件属性。即,架构中具有 :db/isComponent true
的属性。
查看 mbrainz schema,只有 :release/media
和 :medium/tracks
是组件属性,因此它们将是唯一填充有 [*]
拉模式的属性。
如果您的数据模型包含分层引用链(即 :person/friend
作为对任何人的引用,可能也引用了朋友),您可以定义 recursive pull patterns 并指定它们的递归深度(或使用 ...
表示无界)。
此主题也在 Datomic Google Group 上进行了讨论,并包括 link 示例递归拉取模式。
我在这里阅读有关 Datomic 拉语法的信息:
http://docs.datomic.com/pull.html
它在通配符下解释说,像 [*]
这样的模式将拉取一个实体并递归地拉取其实体属性。直接引用:
The wildcard specification * pulls all attributes of an entity, and recursively pulls any component attributes:
;; 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}]}]}
...
]}
但是,当我自己尝试时,我只得到 ref
类型的 db/id
值。我基本上必须在 pull
表达式中以更详细的方式调用任何 ref 类型,如下所示:
[* {:content/type [:db/ident] :content/locales [:db/ident] :content/groups [*]}]
这甚至还没有结束,因为 :content/groups
本身就有 ref
类型。通配符的行为是否在某些时候发生了变化并且文档不是最新的?还是我做错了什么?有没有更好(更简洁)的方式来表达 "just recursively pull it all in"?
拉表达式中的通配符仅填充组件属性。即,架构中具有 :db/isComponent true
的属性。
查看 mbrainz schema,只有 :release/media
和 :medium/tracks
是组件属性,因此它们将是唯一填充有 [*]
拉模式的属性。
如果您的数据模型包含分层引用链(即 :person/friend
作为对任何人的引用,可能也引用了朋友),您可以定义 recursive pull patterns 并指定它们的递归深度(或使用 ...
表示无界)。
此主题也在 Datomic Google Group 上进行了讨论,并包括 link 示例递归拉取模式。