引入依赖:
<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"));
}
}