引入依赖:

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.8.2</version>
</dependency>

1、连接MongoDB数据库

1)直连方式

public class MongoDBUtil {private static MongoClient client = null;static {if(client==null){client = new MongoClient("192.168.3.56", 27017);}}//获取MongoDB数据库public static MongoDatabase getDatabase(String databaseName){return client.getDatabase(databaseName);}//获取Mongo集合public static MongoCollection getCollection(String databaseName,String collectionName){return getDatabase(databaseName).getCollection(collectionName);}
}

2)直连方式支持用户认证

/*** @author houChen* @date 2021/7/10 17:34* @Description: 创建MongoDB拦截,使用用户认证*/
public class MongoDBAuthUtil {private static MongoClient client = null;static {if(client==null){//创建一个用户认证信息MongoCredential credential = MongoCredential.createCredential("itsxt","develope","itsxtpwd".toCharArray());//封装MongoDB的地址和端口ServerAddress address = new ServerAddress("192.168.3.56", 27017);//方法过时是由于现在推荐池连的方式client = new MongoClient(address, Arrays.asList(credential));}}//获取MongoDB数据库public static MongoDatabase getDatabase(String databaseName){return client.getDatabase(databaseName);}//获取Mongo集合public static MongoCollection getCollection(String databaseName,String collectionName){return getDatabase(databaseName).getCollection(collectionName);}
}

3)池连方式

public class MongoDBPoolUtil {private static MongoClient client = null;static {if(client==null){MongoClientOptions.Builder builder = new MongoClientOptions.Builder();//设置每个连接地址的最大连接数builder.connectionsPerHost(10);//设置连接的超时时间builder.connectTimeout(5000);//设置读写的超时时间builder.socketTimeout(5000);ServerAddress address = new ServerAddress("192.168.3.56", 27017);client = new MongoClient(address,builder.build());}}//获取MongoDB数据库public static MongoDatabase getDatabase(String databaseName){return client.getDatabase(databaseName);}//获取Mongo集合public static MongoCollection getCollection(String databaseName, String collectionName){return getDatabase(databaseName).getCollection(collectionName);}
}

4)池连方式支持认证

/*** @author houChen* @date 2021/7/10 18:08* @Description:  支持用户认证的池连*/
public class MongoDBPoolAuthUtil {private static MongoClient client = null;static {if(client==null){MongoClientOptions.Builder builder = new MongoClientOptions.Builder();//设置每个连接地址的最大连接数builder.connectionsPerHost(10);//设置连接的超时时间builder.connectTimeout(5000);//设置读写的超时时间builder.socketTimeout(5000);//创建一个用户认证信息MongoCredential credential = MongoCredential.createCredential("itsxt","develope","itsxtpwd".toCharArray());//封装MongoDB的地址和端口ServerAddress address = new ServerAddress("192.168.3.56", 27017);client = new MongoClient(address,credential,builder.build());}}//获取MongoDB数据库public static MongoDatabase getDatabase(String databaseName){return client.getDatabase(databaseName);}//获取Mongo集合public static MongoCollection getCollection(String databaseName, String collectionName){return getDatabase(databaseName).getCollection(collectionName);}
}

2、操作集合

1)创建集合

MongoDatabase develope = MongoDBPoolUtil.getDatabase("develope");
develope.createCollection("test1");

2)获取集合

MongoCollection<Document> test = develope.getCollection("test");
System.out.println(test.getNamespace());

3)删除集合

MongoCollection<Document> test = develope.getCollection("test1");
test.drop();

3、插入文档

1)单个文档插入

public void insertSingleDocument(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");Document document = new Document();document.append("username","liss").append("age",18 ).append("desc", "prefect");collection.insertOne(document);
}

2)插入多个文档

public void insertManyDocument(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");List<Document> list = new ArrayList<Document>();for(int i=0;i<5;i++){Document document = new Document();document.append("username","liss"+i).append("age",18+i ).append("desc", "prefect"+i);list.add(document);}collection.insertMany(list);
}

4、更新文档

1)更新单个文档单个键

/*
更新单个文档单个key*/
public void updateSingleDocumentSingleKey(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");collection.updateOne(Filters.eq("username","liss"),new Document("$set",new Document("userage",100)));
}

2)更新单个文档多个键

/*
更新单个文档多个键*/
public void updateSingleDocumentManyKey(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");collection.updateOne(Filters.eq("username","liss"),new Document("$set",new Document("userage",100).append("age", "13")));
}

3)更新多个文档单个键

/*
更新单个文档单个个键
将username不为空的文档的age修改为100*/
public void updateManyDocumentSingleKey(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("desc","very good")));
}

4)更新多个文档的多个键

/*
更新多个文档多个键
将username不为空的文档的age修改为3岁,desc修改为哈哈哈哈*/public void updateManyDocumentManyKey(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("age","3岁").append("desc", "哈哈哈哈")));}

5)更新文档的数组

/*更新文档的数组将username为lisi的insterts数组中添加art*/
public void updateArray(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");collection.updateOne(Filters.eq("username", "liss"),new Document("$push",new Document("insterts","art")));
}

5、查询文档

1)查询所有文档

public void searchAllDocument(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

2)根据_id查询文档

/*
根据_id查询文档*/
public void searchDocumentById(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.eq("_id",new ObjectId("60ea475b28339539c8b814f4"))); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

3)查询多个文档 $gt

/*查询多个文档 $gt查询年龄大于19的文档*/
public void searchDocumentByCondition(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.gt("age",19)); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

4)查询多个文档 $type

/*查询多个文档 $type查询age为number文档*/
public void searchDocumentByType(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.type("age","number")); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

5)查询多个文档 $in $nin

/*查询多个文档 $in查询username为liss,liss1,liss2文档$nin=>表示不在这个数组中的文档 ·*/
public void searchDocumentByIn(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.in("username","liss","liss1","liss2")); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

6)查询多个文档 $regex (根据正则表达式来查询)

/*查询多个文档 $regex查询以l开头,2结尾的文档*/
public void searchDocumentByRegex(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.regex("username","^l.*2$")); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

7)查询多个文档 逻辑运算符 $and $or

/*
查询文档 逻辑运算符$and
查询用户名称为liss1 年龄为18的文档*/
public void searchDocumentByAnd(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.and(Filters.eq("username","liss"),Filters.eq("age", 18))); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}/*
查询文档 逻辑运算符$or
查询用户名称为liss1 或者年龄为18的文档*/
public void searchDocumentByAnd(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find(Filters.or(Filters.eq("username","liss"),Filters.eq("age", 18))); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

8)查询文档 - 排序处理

/*
查询文档  $and和$or联合使用
查询文档,根据userName降序排序*/
public void searchDocumentBySort(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");FindIterable<Document> iterable = collection.find().sort(new Document("username", 1));MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+document.get("age"));}
}

6、日期操作

1)插入系统当前日期

/*
插入系统当前日期*/
public void insertSystemDate(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");Document document = new Document();document.put("username", "zhangsan");document.put("age", 22);document.put("desc", "very good");document.put("userBirth", new Date());collection.insertOne(document);
}

2)添加指定日期

/*
插入指定日期*/public void insertDate() throws ParseException {MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date date = simpleDateFormat.parse("2021-07-16 08:00:00");Document document = new Document();document.put("username", "zhangsan");document.put("age", 22);document.put("desc", "very good");document.put("userBirth", date);collection.insertOne(document);}

3)查询日期 $eq

/*
查询日期 $qe*/
public void searchByDate() throws ParseException {MongoCollection collection = MongoDBPoolUtil.getCollection("develope","date");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date date = simpleDateFormat.parse("2021-07-16 08:00:00");FindIterable<Document> iterable = collection.find(Filters.eq("userBirth",date)); //返回的是一个迭代器MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("username")+" "+ document.get("age")+" "+document.get("userBirth"));}
}

【注意】java会将mongo中查出来的时间自动转化时区

7、聚合操作

1)计算文档总数

查询test集合中文档的数量

/*
$sum
查询集合中的文档数量*/
public void selectDocumentAggregateCount(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test");Document sum = new Document();sum.put("$sum", 1);Document count = new Document();count.put("_id", null);count.put("count",sum);Document group = new Document();group.put("$group",count);List<Document> list = new ArrayList<Document>();list.add(group);AggregateIterable iterable = collection.aggregate(list);MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("_id")+" "+document.get("count"));}
}

2)聚合操作 $sum

以title进行分组,并计算每组size的总和

public void selectDocumentAggregateSizeSum(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test1");Document sum = new Document();sum.put("$sum", "$size");Document count = new Document();count.put("_id", "$title");count.put("count",sum);Document group = new Document();group.put("$group",count);List<Document> list = new ArrayList<Document>();list.add(group);AggregateIterable iterable = collection.aggregate(list);MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("_id")+" "+document.get("count"));}
}

3)聚合操作:分组前的数据过滤

查询dev集合size > 200 的文档,并按照title分组,计算size的总和

/*聚合操作:分组前的数据过滤查询dev集合有多少size > 200 的文档*/
public void selectDocumentAggregateSizeGt200(){MongoCollection collection = MongoDBPoolUtil.getCollection("develope","test");Document size = new Document();size.put("size", new Document().append("$gt", 200));Document match = new Document();match.put("$match", size);Document sum = new Document();sum.put("$sum", "$size");Document count = new Document();count.put("_id", "$title");count.put("count",sum);Document group = new Document();group.put("$group",count);List<Document> list = new ArrayList<Document>();list.add(match);list.add(group);AggregateIterable iterable = collection.aggregate(list);MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("_id")+" "+document.get("count"));}
}

4)聚合操作 $project 聚合投影约束

5)分页操作 使用skip和limit进行分页

/*
分页操作 使用skip和limit进行分页*/
public void selectDocumentByPage(int page) {MongoCollection collection = MongoDBPoolUtil.getCollection("develope", "test");FindIterable iterable = collection.find().skip((page - 1) * 2).limit(2);MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("_id")+" "+document.get("title")+" "+document.get("size"));}
}

6)分页查询优化

使用条件判断替换skip方法

=》查询大于某个条件的所有文档,然后再进行分页

/*
分页操作 使用条件判断实现分页查询*/
public void selectDocumentByPage1(int pageIndex,int page,String lastId) {MongoCollection collection = MongoDBPoolUtil.getCollection("develope", "test");FindIterable iterable = null;Document condition = new Document();if(pageIndex==1){iterable = collection.find(condition).limit(page);}else{if(lastId != null){condition.append("_id", new Document("$gt",new ObjectId(lastId));iterable = collection.find(condition).limit(page);}}MongoCursor<Document> cursor = iterable.iterator();  //返回的是一个游标while (cursor.hasNext()){Document document = cursor.next();System.out.println(document.get("_id")+" "+document.get("title")+" "+document.get("size"));}
}

mongo-java-driver操作MongoDB相关推荐

  1. Java API操作MongoDB

    文章目录 前言 一.创建mongodb.properties 二.创建MongoUtils.java 三.创建测试类testMongo.java 前言 本文介绍了怎样通过javaAPI连接操作Mong ...

  2. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客

    前言:在上一篇文章中(PS:https://www.zifangsky.cn/923.html)我简单介绍了如何在Linux中安装MongoDB以及MongoDB的增删改查等基本命令用法(PS:更多M ...

  3. mongodb for java_【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  4. Java操作MongoDB

    之前我们介绍的MongoDB的操作都是在shell命令中写的,在项目开发时我们当然都是用程序去操作MongoDB的,本文我们来看看如何用Java代码操作MongoDB. 本文是MongoDB系列的第十 ...

  5. mongodb java driver 聚合框架

    2019独角兽企业重金招聘Python工程师标准>>> Mongo 2.2.0版本介绍了mongo的聚合框架,该框架可以很方便的实现一些聚合操作,例如计数.取和.计算平均值.框架使用 ...

  6. java mongodb开发_Java Tutorial:Java操作MongoDB入门

    [IT168 技术]个人编译能力有限,以下提供英汉对照,欢迎讨论指正. Introduction 介绍 This page is a brief overview of working with th ...

  7. Nosql数据库MongoDB 理论+实践(JAVA API操作) 代码实践

    文章目录 一.数据库 数据库的概念: 数据库分类 关系型数据库 非关系型数据库 二.Mongo 存储的数据类型 下载 三个层次 基本指令(shell) 三.Mongo Manager Free 概念 ...

  8. java mongodb 增删改查_java操作mongodb:基本的增删改查

    java操作mongodb的代码,包含基本的增删改查操作 获取数据库连接工具类 package com.liuc.db;import java.net.UnknownHostException;imp ...

  9. java操作mongodb(连接池)(转)

    原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...

  10. 【MongoDB for Java】Java操作MongoDB

    软件151--熊佳杨 开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开发依赖库: JavaEE5.mongo-2.5.3. ...

最新文章

  1. tableau实战系列(三十九)-教你如何优雅的做图表展示-南丁格尔玫瑰图
  2. tzwhere模块 根据经纬度判断时区
  3. linux 安装sysstat使用iostat、mpstat、sar、sa
  4. 浅谈Opencl四大模型之Programming Model
  5. android bitmap 替换指定颜色,Android 实现把bitmap图片的某一部分的颜色改成其他颜色...
  6. 【mac】Snagit截图时候鼠标变大太大的解决方法
  7. [20] 鼓状物(Drum)图形的生成算法
  8. Windows VsCode配置OpenCV、Eigen
  9. 打印等腰三角形javascript
  10. FPGA零基础学习:SPI 协议驱动设计
  11. yeahnet邮箱服务器,网易126/163/Yeah.net免费邮箱开放IMAP服务
  12. 按Right-BICEP的测试用例
  13. 八月未央,梦落泸沽。
  14. Excel表格中的三维气泡图,你会做吗?
  15. win10系统一键安装教程
  16. 设计模式六大原则之--开闭原则(OCP)
  17. 《电子元器件的可靠性》——2.5节威布尔分布及其概率纸的结构和用法
  18. 网络统考计算机实机操作,2020年国家开放大学电大考试《计算机应用基础》网络核心课形考网考作业试题及答案(完整版)(42页)-原创力文档...
  19. 【银河麒麟V10U盘只读解决方案】
  20. 注入——sql注入命令

热门文章

  1. 计算机启动过程从电路,pc 启动过程 -- 加载MBR之前的过程,即加电到bios启动过程...
  2. Using Hierarchy Viewer
  3. 《苍炎-羽生结弦》读书摘记
  4. 程序员的数学 学习(指数爆炸)
  5. JAVA反序列化漏洞简单理解
  6. 修改注册表 去除Win7系统快捷方式箭头
  7. 游戏茶苑港式五张看牌外挂的开发与演示
  8. 每日互动联合绍兴高速交警、温州高速交警和浙江高信发布“高速障碍物预警系统”
  9. VISIO 形状工具的位置
  10. 免费沙箱软件模拟支付_沙箱模拟公众号支付的问题