简体   繁体   English

自定义查询正则表达式MongoDB + Spring数据

[英]Custom query regex MongoDB + Spring Data

I'm trying to write a "startsWith" query in Spring Data, using MongoDB. 我正在尝试使用MongoDB在Spring Data中编写一个“ startsWith”查询。 If I write this in Mongo shell, it works, lists every e-mail address starting with letter x or X (case insensitive): db.user.find({email:/^x/i}) 如果我使用Mongo shell编写此代码,它将起作用,并列出每个以字母x或X开头的电子邮件地址(不区分大小写): db.user.find({email:/^x/i})

However, this doesn't: 但是,这不是:

@Query(value = "{'$or':[{'name':?0},{'email':?0}]}")
List<User> findAllByFreeTextSearch(String keyword);

I tried to add the /^.../i to the keyword itself, and in a dozen combinations to the @Query but without luck. 我试图将/^.../i添加到关键字本身,并以十几种组合添加到@Query,但是没有运气。 What is the correct syntax? 正确的语法是什么?

Spring Data wraps those parameters by intent to prevent malicious patterns from being executed via an annotated query. Spring Data意图通过包装这些参数来防止通过带注释的查询执行恶意模式。

Please use $regex like below for that. 请使用下面的$regex

@Query("{'$or':[{ 'name' : { '$regex' : '?0', '$options' : 'i'}}, ...")
List<User> findAllByFreeTextSearch(String keyword);

/expression/ is alternative syntax used in shell & js drivers. / expression /是shell和js驱动程序中使用的替代语法。

You need to pass "^x" as keyword for java driver. 您需要将“ ^ x”作为关键字传递给Java驱动程序。

Try 尝试

@Query(value = "{$or:[{name:{$regex:?0,$options:'i'}},{email:{$regex:?0,$options:'i'}}]}")
List<User> findAllByFreeTextSearch(String keyword);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM