java 操作mongodb 类
package com.te.center;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.gson.Gson;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.WriteResult;
import com.te.pojo.Driver;
import com.te.pojo.User;
/**
*
* @author yqf
*
*/
public class TaxiCenter {
private TaxiCenter(){}
private static Mongo mg = null;
private static DB db;
private static DBCollection drivers;
private static DBCollection users;
private static TaxiCenter tc = new TaxiCenter();
/*private Map<String,Timestamp> driverMap = new HashMap<String,Timestamp>();
private Map<String,Timestamp> userMap = new HashMap<String,Timestamp>(); */
private static boolean isInit = false;
public static TaxiCenter getTaxiCenter(){
init();
return tc;
}
private static void init() {
if(isInit== false){
try {
mg = new Mongo();
//mg = new Mongo("localhost", 27017);
} catch (UnknownHostException e) {
e.fillInStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
//获取temp DB;如果默认没有创建,mongodb会自动创建
db = mg.getDB("te");
//获取users DBCollection;如果默认没有创建,mongodb会自动创建
drivers = db.getCollection("drivers");
users = db.getCollection("users");
//创建二维索引
drivers.createIndex(new BasicDBObject("loc", "2d"));
drivers.ensureIndex("driverID");
drivers.ensureIndex("TIME");
users.createIndex(new BasicDBObject("loc", "2d"));
users.ensureIndex("userID");
users.ensureIndex("TIME");
isInit = true;
}
}
// //乘客队列
// private List<User> passs = new ArrayList<User>();
// //司机队列
// private List<Driver> drvers = new ArrayList<Driver>();
// //对话 key:接收方 value 对话
// private HashMap<Object, ArrayList<Talking>> talks = new HashMap<Object,ArrayList<Talking>>();
/*public synchronized List<Talking> addOrGetTalk(int command,Object receive, Object send, Talking talk){
if(command==0){ //获取消息
//返回处理
if(talks.containsKey(send)){
ArrayList<Talking> ret = talks.get(send);
talks.remove(send);
return ret;
} else {
return new ArrayList<Talking>();
}
} else if(command == 1){ //对话
if(talks.containsKey(receive)){
ArrayList<Talking> list = talks.get(receive);
list.add(talk);
} else {
ArrayList<Talking> list = new ArrayList<Talking>();
list.add(talk);
talks.put(receive, list);
}
//返回处理
if(talks.containsKey(send)){
ArrayList<Talking> ret = talks.get(send);
talks.remove(send);
return ret;
} else {
return new ArrayList<Talking>();
}
} else {
return new ArrayList<Talking>();
}
}*/
/**
* 增加乘客
* @param pass
*/
public void addPass(User pass){
Gson gson = new Gson();
double[] tt = {Double.parseDouble(pass.getLat()), Double.parseDouble(pass.getLng())};
DBObject passObj = new BasicDBObject();
passObj.put("loc", tt);
passObj.put("USER", gson.toJson(pass));
passObj.put("userID", pass.getUserId());
Timestamp time = new java.sql.Timestamp(System.currentTimeMillis());
passObj.put("TIME", time);
DBObject query = new BasicDBObject();
query.put("userID", pass.getUserId());
users.findAndModify(query, null, null, false, passObj, false, true);
//userMap.put(pass.getUserId(), time);
/*query
查询过滤条件
{}
sort
如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作
{}
remove
若为true,被选中对象将在返回前被删除
N/A
update
一个 修改器对象
N/A
new
若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。
false
fields
参见Retrieving a Subset of Fields (1.5.0+)
All fields
upsert
创建新对象若查询结果为空。 示例 (1.5.4+)*/
}
public int removeUser(/*String userId*/Timestamp time){
DBObject passObj = new BasicDBObject();
DBObject qry = new BasicDBObject();
qry.put("$lt", time);
passObj.put("TIME", qry);
WriteResult rst = users.remove(passObj);
return rst.getN();
// userMap.remove(userId);
}
/**
* 增加司机
* @param pass
*/
public void addDriver(Driver driver){
DBObject passObj = new BasicDBObject();
double[] tt = {Double.parseDouble(driver.getLat()), Double.parseDouble(driver.getLng())};
passObj.put("loc", tt);
Gson gson = new Gson();
passObj.put("DRIVER", gson.toJson(driver));
passObj.put("driverID", driver.getPhoneid());
Timestamp time = new java.sql.Timestamp(System.currentTimeMillis());
passObj.put("TIME", time);
//drivers.save(passObj);
DBObject query = new BasicDBObject();
query.put("driverID", driver.getPhoneid());
drivers.findAndModify(query, null, null, false, passObj, false, true);
//driverMap.put(driver.getPhoneid(),new java.sql.Timestamp(System.currentTimeMillis()));
}
public int removeDriver(/*String driverId,*/Timestamp time){
DBObject passObj = new BasicDBObject();
// passObj.put("driverID", driverId);
DBObject qry = new BasicDBObject();
qry.put("$lt", time);
passObj.put("TIME", qry);
WriteResult rst = drivers.remove(passObj);
return rst.getN();
// driverMap.remove(driverId);
}
//查询乘客附近司机
public List<Driver> getDrivers(User user) {
List<Driver> retList = new ArrayList<Driver>();
DBObject src = new BasicDBObject();
double[] userLoc = {Double.parseDouble(user.getLat()), Double.parseDouble(user.getLng())};
src.put("$near", userLoc);
src.put("$maxDistance", 100); //默认100米
DBObject qry = new BasicDBObject();
qry.put("loc", src);
DBCursor c = drivers.find(qry);
Iterator itr = c.iterator();
Gson gson = new Gson();
while(itr.hasNext()){
DBObject obj = (DBObject)itr.next();
Driver driver = (Driver) (gson.fromJson((String)obj.get("DRIVER"), Driver.class));
retList.add(driver);
}
return retList;
}
//查询附近乘客
public List<User> getUsers(Driver driver) {
List<User> retList = new ArrayList<User>();
DBObject src = new BasicDBObject();
double[] userLoc = {Double.parseDouble(driver.getLat()), Double.parseDouble(driver.getLng())};
src.put("$near", userLoc);
src.put("$maxDistance", 100); //默认100米
DBObject qry = new BasicDBObject();
qry.put("loc", src);
DBCursor c = users.find(qry);
Iterator itr = c.iterator();
Gson gson = new Gson();
while(itr.hasNext()){
DBObject obj = (DBObject)itr.next();
User user = (User)gson.fromJson((String)obj.get("USER"), User.class);
retList.add(user);
}
return retList;
}
/*public Map<String, Timestamp> getDriverMap() {
return driverMap;
}
public Map<String, Timestamp> getUserMap() {
return userMap;
}*/
}