mongodb java使用

本文介绍如何使用Java语言结合MongoDB数据库,实现一个出租车中心的功能,包括乘客和司机的管理、位置查询以及对话处理。通过创建索引、查询和修改操作,实现了乘客与司机之间的高效匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
	}*/
	
}

 

### 如何在Java中连接和操作MongoDB 要在 Java 中连接并操作 MongoDB 数据库,可以按照以下方法实现。以下是详细的说明以及代码示例。 #### 连接 MongoDB 实例 要建立与 MongoDB 的连接,需使用 `MongoClient` 类来指定主机地址和端口号。如果 MongoDB 正常运行,默认情况下它会监听本地的 27017 端口[^1]。 ```java import com.mongodb.MongoClient; public class ConnectToMongo { public static void main(String[] args) { MongoClient mongoClient = new MongoClient("localhost", 27017); System.out.println("成功连接到 MongoDB"); // 关闭客户端连接 mongoClient.close(); } } ``` #### 获取数据库实例 通过调用 `getDatabase()` 方法可以从已有的 `MongoClient` 对象获取特定名称的数据库对象。即使该数据库尚未存在,MongoDB 也会自动创建它[^1]。 ```java MongoDatabase database = mongoClient.getDatabase("testdb"); System.out.println("数据库实例:" + database.getName()); ``` #### 执行基本 CRUD 操作 对于常见的增删改查功能,可以通过集合(Collection)来进行具体的数据管理。下面展示了一个简单的插入文档的例子: ```java import org.bson.Document; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; public class BasicCRUDOperations { public static void main(String[] args) { try (MongoClient mongoClient = new MongoClient("localhost", 27017)) { MongoDatabase database = mongoClient.getDatabase("school"); // 获取名为 'students' 的 collection 或者新建一个 MongoCollection<Document> students = database.getCollection("students"); // 插入一条记录 Document studentDoc = new Document("name", "张三").append("age", 20).append("grade", "A+"); students.insertOne(studentDoc); System.out.println("学生数据已插入!"); } } } ``` 以上程序展示了如何向 `students` 集合中添加一个新的学生成绩条目[^2]。 #### 列出所有可用数据库 还可以枚举当前服务器上的全部数据库列表,这有助于确认哪些资源已经就绪或者被访问过。 ```java for (String dbName : mongoClient.listDatabaseNames()) { System.out.println(dbName); } ``` 此片段遍历了由 `listDatabaseNames()` 返回的结果集,并逐一打印每一个数据库的名字[^1]。 --- ### 注意事项 - **驱动版本兼容性**:确保使用Java Driver 版本匹配目标 MongoDB Server 的版本。 - **异常处理机制**:实际项目开发过程中应该加入更完善的错误捕捉逻辑以应对网络中断等问题。 - **安全性考量**:生产环境中建议配置用户名密码认证而非仅依赖默认设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值