package com.agentdriving.user.modular.system.util.mongodb; import com.alibaba.fastjson.JSONObject; import com.mongodb.BasicDBObject; import com.mongodb.client.AggregateIterable; import com.mongodb.client.MongoCursor; import com.agentdriving.user.modular.system.util.mongodb.model.Location; import com.agentdriving.user.modular.system.util.mongodb.model.LocationQuery; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import java.util.*; import java.util.Map.Entry; import java.util.function.Supplier; @Component public class MongoUtils { @Autowired private MongoTemplate mongoTemplate; /** * lambda * @param data 添加数据 * @param collectionName 表名 */ public void insert(Supplier data,String collectionName){ mongoTemplate.insert(data.get(),collectionName); } public void insert(Object data, String collectionName){ mongoTemplate.insert(data,collectionName); } /** * * @param sp 查询条件lambda * @param sets 更新的字段 * @param collectionName 表名 */ public void update(Supplier sp, Supplier> sets, String collectionName){ Query query = Query.query(sp.get()); Update update = new Update(); sets.get().forEach((key,value) ->{ //System.out.println(key); //System.out.println(value); update.set(key,value); }); mongoTemplate.updateFirst(query, update, collectionName); } public void update(Criteria sp, Supplier> sets, String collectionName){ Query query = Query.query(sp); Update update = new Update(); sets.get().forEach((key,value) ->{ //System.out.println(key); //System.out.println(value); update.set(key,value); }); mongoTemplate.updateFirst(query, update, collectionName); } /**lambda * @param sp 查询条件lambda * @param collectionName 表名 * @return */ public List query(Supplier sp, String collectionName, Class entityClass){ Query query = Query.query(sp.get()); List ts = mongoTemplate.find(query,entityClass,collectionName); return ts; } public List query(Criteria sp, String collectionName, Class entityClass){ Query query = Query.query(sp); List ts = mongoTemplate.find(query,entityClass,collectionName); return ts; } /** * @param sp 查询条件lambda * @param collectionName 表名 * @return */ public void delete(Supplier sp, String collectionName){ Query query = Query.query(sp.get()); mongoTemplate.remove(query, collectionName); } public void delete(Criteria sp, String collectionName){ Query query = Query.query(sp); mongoTemplate.remove(query, collectionName); } /** * 查询符合条件总条数 * @return * @throws Exception */ public long findLogCount(HashMap paras,Class entityClass,String collectionName) throws Exception { Query query = new Query(); Criteria criteria = new Criteria(); if (null != paras ) { Iterator> iterator = paras.entrySet().iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = entry.getKey(); Object value = entry.getValue(); criteria.and(key).is(value); } query.addCriteria(criteria); } long count = mongoTemplate.count(query, entityClass,collectionName); return count; } /** * 查询附近的对象 * @param model * @return */ public List geoNear(LocationQuery model){ List resultList = new ArrayList<>(); try{ List pipeLine = new ArrayList<>(); BasicDBObject aggregate = new BasicDBObject("$geoNear", new BasicDBObject("near" , new BasicDBObject("type", "Point") .append("coordinates", model.getCoordinates())) .append("distanceField", "distance") .append("maxDistance", model.getDistance()) .append("spherical", true) ); pipeLine.add(aggregate); AggregateIterable location = mongoTemplate.getCollection("location").aggregate(pipeLine); MongoCursor cursor = location.iterator(); //将查询的结果,封装成对象返回出去 while (cursor.hasNext()) { Document document = cursor.next(); Location node = JSONObject.parseObject(JSONObject.toJSONString(document),Location.class); resultList.add(node); } }catch (Exception e){ e.printStackTrace(); } return resultList; } }