当前位置: 首页 > 知识库问答 >
问题:

Spring数据Mongodb使用@Query处理日期

国盛
2023-03-14

您能帮助我在Spring Data Mongodb中使用@Query查找使用日期的数据吗?

我在下面提供了我的代码:

存储库类:

public interface CustomerRepository extends MongoRepository<Customer, String> {
    @Query("{ 'createdDateTime' : { $gt: ?0 } }")
    List<Customer> findAllCustomersByCreatedDate(Date date);
}

ServiceImpl类:

@Service("CustomerService")
public class CustomerServiceImpl implements CustomerService {
    public List<Customer> findAllCustomersByCreatedDate(String createdDate) throws ParseException {
        return customerRepository.findAllCustomersByCreatedDate(new SimpleDateFormat("YYYY-MM-DD").parse(createdDate));
    }
}

RestController类:

@RestController
@RequestMapping("customers")
public CustomerController {

    @Autowired
    private CustomerService customerService;

    @RequestMapping(value = "/byCreatedDate", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
    public ResponseEntity<List<Customer>> findAllCustomersByCreatedDate(@RequestParam String createdDate)
            throws BusinessException, ParseException {

        List<Customer> customers = customerService.findAllCustomersByCreatedDate(createdDate);
        return ResponseEntity.status(HttpStatus.OK).body(customers);
    }
}

Mongo数据库内的数据供客户收集:

{ "_id" : ObjectId("57851d1ee59782560e77ac3f"), 
  "_class" : "com.myproject.models.Customer", 
  "name" : "Rob",
  "createdBy" : "John", 
  "createdDateTime" : ISODate("2016-07-12T16:38:54.439Z")
}

{ "_id" : ObjectId("5786222b29b42251b16b5233"), 
  "_class" : "com.myproject.models.Customer", 
  "name" : "Sara",
  "createdBy" : "John", 
  "createdDateTime" : ISODate("2016-07-13T08:38:52.116Z")
}

如果我用日期字符串“2016-07-19T14:38:54.439Z”调用下面的URL,即使数据库中没有2016-07-19之后创建的记录,它仍然会返回2个结果(以上2个文档)。

http://localhost:8080/projects/byCreatedDate?createdDate=2016-07-19T14: 38:54.439Z

我上面的代码有什么问题?你能帮忙吗?

如何更正上面的代码来处理Mongodb的日期?

共有2个答案

松骏俊
2023-03-14

另一种方式-

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
LocalDate localDate = dtf.parseLocalDate(createdDate);    
Date dt = Date.from(localDate.atStartOfDay().toInstant(ZoneOffset.UTC));
return customerRepository.findAllCustomersByCreatedDate(dt);
屈畅
2023-03-14

我发现了日期格式不正确的问题,并更改了ServiceImpl类代码,如下所示,现在文档按预期获取:

return customerRepository.findAllCustomersByCreatedDate(
    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(createdDate)
);
 类似资料:
  • 有什么方法可以用spring batch实现这一点,或者我应该创建一个Dao并批量删除每个集合的旧数据。

  • 我正在实现spring批处理作业,用于使用分区方法处理一个DB表中的数百万条记录,如下所示- > 从分区器中的表中提取唯一的分区代码,并在执行上下文中设置相同的代码。 创建一个包含读取器、处理器和写入器的块步骤,以基于特定分区代码处理记录。 是否可以创建分区/线程来处理像thread1进程1-1000,thread2进程1001-2000等? 如何控制创建的线程数,因为分区代码可以是100个左右,

  • 我使用的是Spring Batch 2.1.8。释放我有一个文件,它由一些头信息和一些需要处理的记录组成。 我有一个使用面向块处理的步骤。该步骤包含ItemReader和ItemWriter的实现。ItemReader实现是线程安全的,而ItemWriter不是。 我想在处理(或写入)任何记录之前使用标题信息。在继续使用面向块的处理时,如何确保这一点? 建议的解决方案:一种解决方案可以是编写一个预

  • 顺便说一句:我的应用程序是一些REST控制器和一些批处理作业的组合。那么使用云数据流有意义吗?如果没有,那么是否有更好的控制台管理器用于批处理作业(如重新启动、取消作业门户)等?

  • 我正在尝试按日期使用过滤器,如下所示。 但与使用ISO格式“2015-05-16T07:55:23.257Z”不同,spring数据mongodb生成以下查询

  • 我正在使用spring数据与mongodb通信,我正在寻找一种执行地理查询的方法,该方法将通过DB中给定的地理点检索附近的纵断面,我对查询的要求如下: 1) 按距离限制2)按返回的配置文件数量限制3)根据配置文件文档中的时间字段进行额外搜索4)从检索到的文档中包括/排除字段的能力 起初我用mongoTemplate.geo接近法... 但是后来我意识到mongo不支持在Geo近东查询中包含/排除字