JAVA操作MongoDB数据库示例形式(原生+morphia框架)后附库操作

本文详细介绍MongoDB数据库的各种操作,包括数据增删改查、批量修改、条件查询、分页、正则匹配、分组聚合、索引创建及备份恢复等核心功能。

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

一.基础
1.添加

Givegift givegift=new Givegift();    
givegift.setUserId(userId);    
givegift.setTime(DateUtil.currentTimeSeconds());   
dsForRW.save(givegift);

2.根据id删除一条数据 id一定要是object类型

Query<Gift> q=dsForRW.createQuery(Gift.class);
q.filter("giftId", new ObjectId(giftId));
dsForRW.delete(q);

3.修改记录 传入的giftId一定要修改为object类型的

Query<Gift> q = dsForRW.createQuery(Gift.class).field("_id").equal(new ObjectId(giftId));
UpdateOperations<Gift> ops = dsForRW.createUpdateOperations(Gift.class);
ops.set("name", name);
ops.inc("price",1000);//在原来价格的基础上增加1000元
ops.inc("price",-1000);//在原来价格的基础上减少1000元
Gift gift = dsForRW.findAndModify(q, ops);//这个是返回修改完成的  dsForRW.update(query, ops); 这个是没有返回值的

4.根据id查询一条数据

Query<User> q=dsForRW.createQuery(User.class);
q.filter("userId",userId);
User user=new User();
user=q.get();

query.field("key字段值").notEqual(条件);    //notEqualb不等于
query.field("key字段值").greaterThanOrEq(条件);   //greaterThanOrEq 大于等于
query.field("key字段值").lessThanOrEq(条件);    //lessThanOrEq 小于等于
q.field("key字段值").contains(条件);  //contains 包含

5.查询记录个数

Query<Hotel> query = ds.createQuery(Hotel.class);    
return (int) query.countAll();  

// 条件q
DBObject q = new BasicDBObject();
q.put("onlinestate", 1);
long count = dsForRW.getCollection(User.class).getCount(q);
    
.find(q).count() 也行

6.查询列表

Query<Hotel> query = ds.createQuery(Hotel.class);  
query.field("hotelName").equal("如家酒店");        // 此处是精确查询  
query.field("hotelName").contains("如家");        // 此处是模糊查询,酒店名称包含'如家'   
query.field("price").greaterThan(100);           // 查询价格大于100的酒店  
query.field("price").lessThan(500);             // 查询价格小于500的酒店 
		
//and
query.and(query.criteria("hotelName").contains("如家"),   
query.criteria("hotelAddress").contains("建设")); 

//or
 query.or(query.criteria("hotelName").contains("如家"),   
 query.criteria("hotelName").contains("汉庭")); 
					
// 按价格正序排列  或者  按时间倒序排序(前面加一个'-')  
 query.order("price");                           
 query.order("-creatTime");                       
          
 // 分页相关,如果没有offset和limit,则一次性取出所有结果  
 query.offset(0);                                // 先得到查询结果集,然后从第0个开始取数据  
 query.limit(10);                                // 先得到查询结果集,一次最多从结果集中获取10个结果  
 return query.asList(); 

7.多个条件or的实现方法
方式1:

// 条件q
DBObject q = new BasicDBObject();
BasicDBList qList = new BasicDBList();  //BasicDBList和"$in"作为BasicDBObject参数使用,有点类似or
q.put("onlinestate", 1);
qList.add((new BasicDBObject("likes", new BasicDBObject("$gt", 100))));
qList.add((new BasicDBObject("likes", new BasicDBObject("$lt", 500))));
q.put("$or", qList);  //多个条件or的实现方法,

方式2:

query.or(query.criteria("fromUserAccountID").equal(userId), query.criteria("fromUserAccountID").equal(toUserId));

8.正则匹配条件

//除去本人删除的消息
Pattern compile = Pattern.compile("^((?!" + userId + ").)*$", Pattern.CASE_INSENSITIVE);
query.field("delPerson").equal(compile);

9.指定返回字段 通过findone

DBObject q = new BasicDBObject();
		q.put("from",from);
		q.put("isReceived",0);
		q.put("to",to);
		
		DBObject q2 = new BasicDBObject();		
		q2.put("_id",true);
		q2.put("from",true);
		q2.put("to",true);
		q2.put("ts",true);
		q2.put("contentType",true);
		q2.put("content",true);
		q2.put("isRonceal",true);
		
return dsForNetty.getDB().getCollection("messageHistory").findOne(q,q2,new BasicDBObject("ts", -1));

10.分页

morphia框架:

dsForNetty.getCollection(GroupNoticeMessageHistory.class).find(q).sort(new BasicDBObject("time", 1))
				.skip(pageIndex * pageSize).limit(pageSize).toArray();

原生:

dsForRW.createQuery(SingleChatMessage.class).order("-createdAt").offset(pageIndex * pageSize).limit(pageSize).asList();

二. 不通过实体类的aduc
1.post请求 转换为map集合添加

Map<String, String[]> parameterMap = request.getParameterMap();
		BasicDBObject dbObj=new BasicDBObject();
		for (Entry<String,String[]> entry : parameterMap.entrySet()) {
			 dbObj.put(entry.getKey(), entry.getValue()[0]);
		}
		userManager.getDatastore().getDB().getCollection("message").insert(new BasicDBObject(dbObj));

2.删除 id为object类型

BasicDBObject query=new BasicDBObject("_id", new ObjectId(id));
userManager.getDatastore().getDB().getCollection("message").remove(query);

3.修改

Map<String, String[]> parameterMap = request.getParameterMap();
BasicDBObject dbObj=new BasicDBObject();
for (Entry<String,String[]> entry : parameterMap.entrySet()) {
	 dbObj.put(entry.getKey(), entry.getValue()[0]);
}
BasicDBObject query=new BasicDBObject("_id", parse(dbObj.getString("_id")));
dbObj.remove("_id");
userManager.getDatastore().getDB().getCollection("message").update(query, new BasicDBObject(MongoOperator.SET, dbObj),true,false);

4.查询 和 按照条件查询

DBCollection db=dsForRW.getDB().getCollection("message");
		BasicDBObject query=null;
		
		if(!StringUtil.isEmpty(keyword)){
			query=new BasicDBObject();
		  BasicDBList values = new BasicDBList();
		  values.add(new BasicDBObject("type", new BasicDBObject(MongoOperator.REGEX, keyword))); 
		  values.add(new BasicDBObject("code", new BasicDBObject(MongoOperator.REGEX, keyword))); 
	      query.put("$or", values); 
		}
		List<DBObject> list =null;
		 long total=0;
		 if(null==query){
				list= db.find().skip(pageIndex*pageSize).limit(pageSize).sort(new BasicDBObject("_id",-1)).toArray();
				total=db.count();
		 }else{
			 list=db.find(query).skip(pageIndex*pageSize).limit(pageSize).sort(new BasicDBObject("_id",-1)).toArray();
			 total=db.count(query);
		 }
		mav.addObject("page", new PageVO(list, total, pageIndex, pageSize));

		$gt: >
        $gte:>=
        $eq:  =
        $ne:  !=
        $lt:  <
        $lte: <= 
        $in:  in(后面的值为bson对象数组)
        $nin: not in(后面的值为bson对象数组)

三.高级:
1.分组(过滤字段)

手动引用
import static org.mongodb.morphia.aggregation.Group.first;
import static org.mongodb.morphia.aggregation.Group.grouping;
import static org.mongodb.morphia.aggregation.Group.id;

  AggregationPipeline friendsToUserId = dsForRW.createAggregation(Friends.class).match(query)
    		.group(id(grouping("toUserId")), grouping("toUserId", first("toUserId")));
           
    // 指定聚合的输出格式为CURSOR
    AggregationOptions aggregationOptions = AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build();
    
    return Lists.newArrayList(friendsToUserId.aggregate("friends", FriendsToUserId.class, aggregationOptions, dsForRW.getCollection(Friends.class).getReadPreference()));

FriendsToUserId.class是新建的类

public class FriendsToUserId {
private String toUserId;

public String getToUserId() {
	return toUserId;
}

public void setToUserId(String toUserId) {
	this.toUserId = toUserId;
}

}

最终返回List<FriendsToUserId>的id

2.MongoDB批量修改

DBObject command = new BasicDBObject();
		command.put("update", "messageHistory");
		List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
		for (String i : id) {
			
			BasicDBObject jo = new BasicDBObject();
			jo.put("_id",new ObjectId(i));		
					
			BasicDBObject isReads = new BasicDBObject();
			isReads.put("isRead", isRead);
			
			BasicDBObject jo2 = new BasicDBObject();
			jo2.put("$set", isReads);
			
			BasicDBObject update = new BasicDBObject();
			update.put("q", jo);
			update.put("u", jo2);
			update.put("upsert", true);
			update.put("multi", true);
			updateList.add(update);
		}
		command.put("updates", updateList);
		command.put("ordered", true);
		CommandResult commandResult = dsForNetty.getDB().command(command);	  

//两种批量修改用法,经多次测试方法1在执行效率上高于方法2。使用的时候两种有差异,但是皆可使用

	//1、使用自己封装的MongoUpdateUtil工具类
	//要修改的用户Id数组
	int[] userIds = {10000004,10000005,10000006,10000007,10000008};
	//批量修改集
	List<UpdateOptions> list = new ArrayList<UpdateOptions>();
	for (int i = 0; i < userIds.length; i++) {
		//条件
		BasicDBObject queryDBObject = new BasicDBObject();
		queryDBObject.put("_id", userIds[i]);
		
		//修改的内容
		BasicDBObject updateDBObject = new BasicDBObject();
		updateDBObject.put("name", "dawn");
		
		//执行的操作
		BasicDBObject setDBObject = new BasicDBObject();
		setDBObject.put("$set", updateDBObject);
		
		//包装修改对象
		UpdateOptions updateOptions = new UpdateOptions();
		updateOptions.setQuery(queryDBObject);
		updateOptions.setUpdate(setDBObject);
		updateOptions.setUpsert(false);
		updateOptions.setMulti(true);
		list.add(updateOptions);
	}

	long startTime = System.currentTimeMillis();
	//执行批量修改
	MongoUpdateUtil.update(dsForRW.getCollection(User.class), "user", list, true);
	
	
	//2、使用MongoDB自带批量修改工具类
	//条件
	/*BasicDBObject queryDBObject = new BasicDBObject();
	queryDBObject.put("name", "dawn");
	//修改的内容
	BasicDBObject updateDBObject = new BasicDBObject();
	updateDBObject.put("name", "Dawn");
	//执行的操作
	BasicDBObject setDBObject = new BasicDBObject();
	setDBObject.put("$set", updateDBObject);
	
	//执行批量修改
	dsForRW.getCollection(User.class).update(queryDBObject, setDBObject, true, true);*/
	
	long endTime = System.currentTimeMillis();
	System.err.println(endTime-startTime);

四.MongoDB数据库基本操作

1 .添加一个字段. url 代表表名 , 添加字段 content。 字符串类型。

db.collection.update({}, {$set: {content:""}}, {multi: 1})

2 .删除一个字段

db.collection.update({},{$unset:{'content':''}},false, true)

3.查询总数

db.collection.find().count()

4.修改

 db.collection.update(                            
   {"key字段值" : 条件},  
   { $set: { "key字段值" : 要修改的值} },  
   false,  
   true  
)  

5.删除文档

db.collection.remove()

6.删除重复数据

db.collection.aggregate([
    {
        $group: { _id: {company: '$company',username: '$username'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
    },
    {
        $match: {count: {$gt: 1}}
    }
]).forEach(function(doc){
    doc.dups.shift();
    db.user2.remove({_id: {$in: doc.dups}});
})

7.MongoDB添加索引

索引:

db.collection.ensureIndex({"name":1})

联合索引:

db.collection.ensureIndex({"code":1,"type":1})

8.导入 导出 备份
导入:

mongoimport --host localhost --port 27017 --username user --password 123456 --collection host_locations_test --db ezsonar_25 --file /root/mgdbsql/user.json

参数重点说明:
– host 后的 localhost:要导入的数据库 ip
–port 后的 27017:要导入的实例节点端口号
–username 后的 user:数据库用户名
–password 后的 123456:数据库用户密码
–collection 后的 host_locations_test:要导入的表名
–db 后的 ezsonar_25:要导入的表所在数据库名
–file 后的 /root/mgdbsql/user.json:要导入的源文件路径(默认为当前文件夹)

导出:

mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名

参数重点说明:
-f 导出指定字段,以逗号分割,-f uid,name,age导出uid,name,age这三个字段
-q 可以根据查询条件导出,-q ‘{ “uid” : “100” }’ 导出uid为100的数据
–csv 表示导出的文件格式为csv的。这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点

导出整个集合:

mongoexport -h dbhost -d dbname -c collectionname -f collectionKey -o dbdirectory

参数重点说明:
-h: MongoDB所在服务器地址 
-d: 需要恢复的数据库实例
-c: 需要恢复的集合
-f: 需要导出的字段(省略为所有字段)
-o: 表示导出的文件名

比如要备份 OTT_DB数据库实例里面trsdata1集合到csv文件里面

mongoexport -h 127.0.0.1:27017 -d OTT_DB -c trsdata1 -o E:\data\dump\trsdata.csv 也可以导出json,txt等格式

备份:

mongodump -h dbhost -d dbname -o dbdirectory

参数重点说明:
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值