【发布时间】:2017-10-12 06:53:19
【问题描述】:
我正在使用 MongoDB 开发 Spring MVC。 我用 orOperator 为某些字段添加了条件,每个字段在数据库中都有值,但返回的列表是空的。
criteriaQuery.addCriteria(Criteria.where("First_Name").is(docName.trim())
.orOperator(Criteria.where("Middle_Name").is(docName.trim())
.orOperator(Criteria.where("Last_Name").is(docName.trim()))));
控制台中的查询打印是
Query: { "First_Name" : "ESTHER" , "$or" : [ { "Middle_Name" : "ESTHER" , "$or" : [ { "Last_Name" : "ESTHER"}]}]}, Fields: null, Sort: null
我尝试了 Like 查询,但结果也一样
criteriaQuery.addCriteria(Criteria.where("First_Name").regex(docName)
.orOperator(Criteria.where("Middle_Name").regex(docName))
.orOperator(Criteria.where("Last_Name").regex(docName)));
Mongo 查询
db.doctor_details.find({ "$or" : {"First_Name" : { "$regex" : "ESTHER"} }, "$or" : [ { "Middle_Name" : { "$regex" : "ESTHER"} , "$or" : [ { "Last_Name" : { "$regex" : "ESTHER"}}]}]})
帮助我得到结果,我不知道我的代码哪里出错了。感谢您的帮助!
谢谢
【问题讨论】:
-
因为应该是
.orOperator(Criteria.where("Middle_Name").is(docName.trim(), Criteria.where("Last_Name").is(docName.trim()),从得到的序列化中应该可以看出。$or必须是List的Criteria而不是多个构造。 -
仍然返回空
-
你真的有匹配的文件吗?请注意,您实际上是在要求在任一字段中出现具有该精确大写值(或至少部分单词匹配)的内容。因此,如果大小写不同,除非您在正则表达式中实际要求它,否则它不会匹配。
-
通过将代码更改为 criteriaQuery.addCriteria( new Criteria().orOperator(Criteria.where("First_Name").is(docName.trim()),Criteria.where("Middle_Name") .is(docName.trim()), Criteria.where("Last_Name").is(docName.trim()))); ,这给了我结果,但是我如何在 orOperator 中添加 Like
-
“内部”是什么意思?您的问题要求为
First_Name、Middle_Name或Last_Name提供$or。这就是正确的语法为您做的事情。如果您打算做其他事情,那么您的问题中并没有清楚地表达出来,因此可以进行一些修改。