【问题标题】:OrOperator in MongoTemplate not returning values?MongoTemplate 中的 OrOperator 不返回值?
【发布时间】: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 必须是 ListCriteria 而不是多个构造。
  • 仍然返回空
  • 你真的有匹配的文件吗?请注意,您实际上是在要求在任一字段中出现具有该精确大写值(或至少部分单词匹配)的内容。因此,如果大小写不同,除非您在正则表达式中实际要求它,否则它不会匹配。
  • 通过将代码更改为 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_NameMiddle_NameLast_Name 提供$or。这就是正确的语法为您做的事情。如果您打算做其他事情,那么您的问题中并没有清楚地表达出来,因此可以进行一些修改。

标签: spring mongodb


【解决方案1】:

据我所知,为了使用 orOperator 你应该这样做:

Query query = new Query(new Criteria().orOperator(criteriaV1,criteriaV2));

it is based on this answer

【讨论】:

    猜你喜欢
    • 2023-02-13
    • 1970-01-01
    • 2021-12-23
    • 2019-10-04
    • 2020-01-23
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多