package com.supersavedriving.driver.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.supersavedriving.driver.modular.system.util.mongodb.model.Location;
|
import com.supersavedriving.driver.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<T> {
|
|
@Autowired
|
private MongoTemplate mongoTemplate;
|
|
/**
|
* lambda
|
* @param data 添加数据
|
* @param collectionName 表名
|
*/
|
public void insert(Supplier<T> 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<Criteria> sp, Supplier<Map<String,Object>> 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<Map<String,Object>> 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<T> query(Supplier<Criteria> sp, String collectionName, Class entityClass){
|
Query query = Query.query(sp.get());
|
List<T> ts = mongoTemplate.find(query,entityClass,collectionName);
|
|
return ts;
|
}
|
|
public List<T> query(Criteria sp, String collectionName, Class entityClass){
|
Query query = Query.query(sp);
|
List<T> ts = mongoTemplate.find(query,entityClass,collectionName);
|
|
return ts;
|
}
|
|
/**
|
* @param sp 查询条件lambda
|
* @param collectionName 表名
|
* @return
|
*/
|
public void delete(Supplier<Criteria> 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<String,Object> paras,Class entityClass,String collectionName) throws Exception {
|
Query query = new Query();
|
Criteria criteria = new Criteria();
|
if (null != paras ) {
|
Iterator<Entry<String, Object>> iterator = paras.entrySet().iterator();
|
while(iterator.hasNext()) {
|
Entry<String, Object> 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<Location> geoNear(LocationQuery model){
|
List<Location> resultList = new ArrayList<>();
|
try{
|
List<BasicDBObject> 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<Document> location = mongoTemplate.getCollection("location").aggregate(pipeLine);
|
MongoCursor<Document> cursor = location.iterator();
|
|
//将查询的结果,封装成对象返回出去
|
while (cursor.hasNext()) {
|
org.bson.Document document = cursor.next();
|
Location node = JSONObject.parseObject(JSONObject.toJSONString(document),Location.class);
|
resultList.add(node);
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return resultList;
|
}
|
|
}
|