最近用springboot自帶的MongoTemplate來做訂單模塊的一些操作,過程中發現裏面的坑,比如如下需求
根據訂單狀態修改時間最近的一條訂單狀態
那麼條件就是:1.訂單狀態 2.根據時間排序
然後我是這樣寫的
Query query = new Query();
query.addCriteria(Criteria.where("orderstatus").is(orderstatus));
query.with(Sort.by(Sort.Order.desc("ordertime")));
Update update = new Update().set("orderstatus", orderStatus);
mongoTemplate.updateFirst(query, update, Order.class);
用mongoTemplate.find查詢出來的數據和預期的效果一樣,但是發現,mongoTemplate.updateFirst修改的第一條數據始終都只會修改列表中的第一條訂單,邏輯是沒有問題的,經過各種測試,最後得知,原來query.with(Sort.by(Sort.Order.desc("ordertime")));這個排序並沒有加到查詢條件裏面去
最後解決方案
先查詢,然後再修改
Query query = new Query();
query.addCriteria(Criteria.where("orderstatus").is(orderstatus));
query.with(Sort.by(Sort.Order.desc("ordertime")));
//獲取集合的第一條數據,然後再去修改
Order order= mongoTemplate.find(query, Order.class).get(0);
Query query2 = new Query();
query2.addCriteria(Criteria.where("orderid").is(order.getOrderId()));
Update update = new Update().set("orderstatus", orderStatus);
mongoTemplate.updateFirst(query2, update, Order.class);