我是Datomic的新手,我试图了解如何进行不区分大小写的查询。
例如:
[:find (pull ?u [:user/email])
:where [?u :user/email "user1@example.net"]]
返回:
{:user/email "user1@example.net"}
我希望此查询为指定为" USER1@example.net"的电子邮件返回相同的值;但Datomic正在对电子邮件进行区分大小写的比较,如此处所示。
[:find (pull ?u [:user/email])
:where [?u :user/email "USER1@example.net"]]
返回:
Nothing
有关形成查询的最佳方式的任何建议,以便进行区分大小写的比较吗?
答案 0 :(得分:4)
要执行不区分大小写的查询,我使用Clojure re-find
函数形成了查询,以对传递的电子邮件执行不区分大小写的正则表达式匹配,如下所示:
[:find (pull ?u [:user/email])
:where
[?u :user/email ?email]
[(re-find #"(?i)USER1@example.net" ?email)]
] db)
现在返回:
{:user/email "user1@example.net"}
答案 1 :(得分:3)
只需将查询字符串和数据库项转换为小写。
(defn case-insensitive-get-email
[email]
(d/q '[:find ?lowercaseEmail .
:in $ ?email
:where
[?e :user/email ?originalEmail]
[(.toLowerCase ^String ?originalEmail) ?lowercaseEmail]
[(= ?lowercaseEmail ?email)]]
db (.toLowerCase email)
)
)
然后
(case-insensitive-get-email "USER1@example.net")
意愿 返回
"user1@example.net"