之前对于spring的mongoTemplate真的是有点又爱又恨,由于它对mongodb的驱动做了一层封装,使得在开发的时候方便了许多,但是它的语法和mongo的原生js有很大不同,有时候在mongo官方文档里的API接口很多时候在mongoTemplate中的使用完全不一样,导致有些时候用的很别扭,而且一些语句完全不知道怎么去转换为template的语法。不过最近的两次使用经历使得我对mongoTemplate有了一些改观。
第一个就是mongoTemplate自身的criteria.where没有>和<的操作,也就是对mongo的一条记录自身的两个字段进行比较。mongo语句如下:
db.whereColl.find({$where: "this.b > this.a"})
当时研究和许久,最后实在没招了,扒源码找出了它的Criteria实现,下面是它的源码实现:
/** * Creates a criterion using the { @literal $elemMatch} operator * * @see http://docs.mongodb.org/manual/reference/operator/query/elemMatch/ * @param c * @return */ public Criteria elemMatch(Criteria c) { criteria.put("$elemMatch", c.getCriteriaObject()); return this; }
/** * Creates an 'and' criteria using the $and operator for all of the provided criteria. * <p> * Note that mongodb doesn't support an $and operator to be wrapped in a $not operator. * <p> * * @throws IllegalArgumentException if { @link #andOperator(Criteria...)} follows a not() call directly. * @param criteria */ public Criteria andOperator(Criteria... criteria) { BasicDBList bsonList = createCriteriaList(criteria); return registerCriteriaChainElement(new Criteria("$and").is(bsonList)); }
private BasicDBList createCriteriaList(Criteria[] criteria) { BasicDBList bsonList = new BasicDBList(); for (Criteria c : criteria) { bsonList.add(c.getCriteriaObject()); } return bsonList