2017-05-31 25 views
0

是否可以将通配符_传递给参数化查询?类似这样的:是否可以将数据通配符“_”传递给参数化查询?

(d/q [:find ?e 
     :in $ ?type 
     :where [?e :type ?type]] db _) 

当我按照上面所写的方法尝试这个时,它抛出一个错误。有没有办法做到这一点?

我知道我可以得到一切与查询,看起来像这样:

(d/Q [:查找电子 :其中,[E:?类型]] DB)

但我目标是避免在我不想过滤:type的结果时需要构建单独的查询。用例是,例如,API端点可能会或可能不会过滤结果。

+0

你可以添加一个你想要做的例子吗? –

回答

1

如果我理解正确的话,你应该能够键入:

(d/q [:find ?e 
     :in $ 
     :where [?e :type]] db) 

在Datomic,任何未指定的值被认为是通配符。上述查询将返回具有:type属性的所有实体的列表,而不管其值如何。

更新

Datomic的查询被设计成接受一个普通值像5:awesome被代入变量?type。像_(或引用版本'_)的符号不符合Datomic预期的模式。

只是为了好玩,我尝试了几种变化,并且无法让Datomic以您提议的方式接受符号'_'为?type变量。我想你必须为通配案例编写一个单独的查询。

基本上,通配符_是Datomic查询语法中的一个特殊符号(又名“保留字”),就像$一样。 Datomic还强制查询变量以?开头,如?e?type。这些要求是Datomic DSL的一部分,您无法更改。

除了手工编写单独的查询之外,唯一的解决方法是动态组合来自基础部分和附加部件的查询向量。是否比手写不同查询更容易或更困难取决于您的具体情况。

+0

我应该提供更多的上下文。这适用于api端点,可以在应用或不应用过滤器的情况下获取结果。我试图避免的是,当没有按照特定的':type'过滤器时,需要构造一个不同的查询结构,因为构建单独的查询会产生一团糟的代码,而能够提供通配符会更加简洁。 – fraxture

相关问题