学习主题:MongoDb
学习目标:
掌握如下内容
1.添加文档
2.更新文档
3.查询文档
4.运算符的使用
5.日期操作
6.聚合操作
7.分页操作
一、插入文档
package com.bjsxt;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 插入文档
*/
public class InsertDocument {
public static void main(String[] args) {
InsertDocument doc=new InsertDocument();
/*doc.insertSingleDocument();*/
doc.insertManyDocument();
}
/**
* 插入单个文档
*/
public void insertSingleDocument(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
Document docu = new Document();
docu.append("username","lisi").append("userage",26).append("userdesc","Very Good").append("userlike", Arrays.asList(new String[]{"Music","Sport"}));
collection.insertOne(docu);
}
/**
* 插入多个文档
*/
public void insertManyDocument(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
List<Document> list=new ArrayList<Document>();
for (int i=0;i<5;i++){
Document docu=new Document();
docu.append("username","zhangsan"+i);
docu.append("userage",37+i);
docu.append("userdesc","Pretty"+i);
docu.append("userlike", Arrays.asList(new String[]{"Music","Sport"}));
list.add(docu);
}
collection.insertMany(list);
}
}
二、 更新文档
package com.bjsxt;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import java.util.logging.Filter;
/**
* 更新文档
*/
public class UpdateDocument {
public static void main(String[] args) {
UpdateDocument updoc=new UpdateDocument();
/*updoc.updateSingleDocumentSingleKey();*/
/* updoc.updateSingleDocumentManyKey();*/
/* updoc.updateManyDocumentSingleKey();*/
/* updoc.updateManyDocumentManyKey();*/
updoc.updateDocumentArray();
}
/**
* 更新单个文档单个键
*/
public void updateSingleDocumentSingleKey(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
//更新文档单个键
//Filters 封装了条件的一个工具类 {$set:{userage:28}}
collection.updateOne(Filters.eq("username","lisi"),new Document("$set",new Document("userage",29)));
}
/**
* 更新单个文档多个键
*/
public void updateSingleDocumentManyKey(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
collection.updateOne(Filters.eq("username","zhangsan0"),new Document("$set",new Document("userage",18).append("userdesc","LOVE")));
}
/**
* 更新多个文档单个键
*/
public void updateManyDocumentSingleKey(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("userdesc","LOVE")));
}
/**
* 更新多个文档多个键
*/
public void updateManyDocumentManyKey(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
collection.updateMany(Filters.ne("username",null),new Document("$set",new Document("userdesc","LOVE").append("userage",27)));
}
/**
* 更新文档数组
*/
public void updateDocumentArray(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
collection.updateOne(Filters.eq("username","lisi"),new Document("$push",new Document("userlike","Art")));
}
}
三、查询文档
package com.bjsxt;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.regex.Pattern;
/**
* 查询文档
*/
public class SelectDocument {
public static void main(String[] args) {
SelectDocument doc=new SelectDocument();
/* doc.selectDocumentAll();*/
/* doc.selectDocumentById();*/
/* doc.selectDocumentConditionByGt();*/
/* doc.selectDocumentConditionByType();*/
/* doc.selectDocumentConditionByIn();*/
/* doc.selectDocumentConditionByNin();*/
/* doc.selectDocumentConditionByRegex();*/
/* doc.selectDocumentConditionByAnd();*/
/*doc.selectDocumentConditionByOr();*/
/*doc.selectDocumentConditionByAndOr();*/
doc.selectDocumentSorting();
}
/**
* 查询所有文档
*/
public void selectDocumentAll(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
// 返回的是一个文档的迭代器
FindIterable<Document> iterable = collection.find();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 根据id查询文档
*/
public void selectDocumentById(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable<Document> iterable = collection.find(Filters.eq("_id",new ObjectId("5dc0d97770725e0888467aa9")));
//返回一个文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 根据条件查询文档,年龄大于22
*/
public void selectDocumentConditionByGt(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable<Document> iterable = collection.find(Filters.gt("userage",22));
//返回一个文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 根据字段类型查询文档
*/
public void selectDocumentConditionByType(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.type("userage","number"));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询筛选,查name为zhangsan0,zhangsan1
*/
public void selectDocumentConditionByIn(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.in("username","zhangsan0","zhangsan1"));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询筛选,查name不为zhangsan0,zhangsan1
*/
public void selectDocumentConditionByNin(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.nin("username","zhangsan0","zhangsan1"));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
*正则表达式查询文档,以z开头2结尾
*/
public void selectDocumentConditionByRegex(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.regex("username", Pattern.compile("^z.*2")));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询用户 username 是 zhangsan1 并且年龄为 20 岁的用户
*/
public void selectDocumentConditionByAnd(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.and(Filters.eq("username","zhangsan1"),Filters.eq("userage",20),Filters.eq("userdesc","HELLO")));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询用户要求 username 是 lisi ,或者 userage 是 27 或者 userdesc 是 HELLO
*/
public void selectDocumentConditionByOr(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.or(Filters.eq("username","lisi"),Filters.eq("userage",27),Filters.eq("userdesc","HELLO")));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询文档中 username 为 zhangsan1 并且年龄为 20 岁,或者 userdesc 为 LOVE
*/
public void selectDocumentConditionByAndOr(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.or(Filters.and(Filters.eq("username","zhangsan1"),Filters.eq("userage",20)),Filters.eq("userdesc","LOVE")));
//返回文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
/**
* 查询文档中 username 是 z 开头的,根据 username 对结果做降序排序。 1升序排序, -1 降序排序规则 $sort:{username,-1}
*/
public void selectDocumentSorting(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
FindIterable iterable = collection.find(Filters.regex("username",Pattern.compile("^z"))).sort(new Document("username",-1));
//获取文档迭代器
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike"));
}
}
}
四、日期操作
package com.bjsxt;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
/**
* Date To String
*/
public static String dateToString(String pattern, Date date){
SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);
return dateFormat.format(date);
}
/**
* String To Date
*/
public static Date stringToDate(String pattern,String date){
SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);
Date d=null;
try {
d=dateFormat.parse(date);
}catch (Exception e){
e.printStackTrace();
}
return d;
}
}
package com.bjsxt;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import java.util.Arrays;
import java.util.Date;
/**
* 插入时间
*/
public class DateOperation {
public static void main(String[] args) {
DateOperation operation=new DateOperation();
/*operation.inserDocumentSystemDate();*/
/* operation.insertDocumentCustoDate();*/
/* operation.selectDocumentDateUseEq();*/
operation.selectDocumentDateUseGt();
}
/**
* 插入系统当前时间
*/
public void inserDocumentSystemDate(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
Document docu=new Document();
docu.put("username","laozh");
docu.put("userage",18);
docu.put("userdesc","LOVE");
docu.put("userlike", Arrays.asList("Look","Eat"));
docu.put("userbirth",new Date());
collection.insertOne(docu);
}
/**
* 插入自定义时间
*/
public void insertDocumentCustoDate(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-12-06 21:30:36");
Document docu=new Document();
docu.put("username","hhz");
docu.put("userage",20);
docu.put("userdesc","YOU");
docu.put("userlike", Arrays.asList(new String[]{"Sing","Good"}));
docu.put("userbirth",date);
collection.insertOne(docu);
}
/**
* 查询日期 : 2019-12-06 21:30:36
*/
public void selectDocumentDateUseEq(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-12-06 21:30:36");
FindIterable iterable = collection.find(Filters.eq("userbirth",date));
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
String temp = DateUtil.dateToString("yyyy-MM-dd HH:mm:ss", (Date) docu.get("userbirth"));
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike")+"\t"+temp);
}
}
/**
* 查询日期大于2019-01-01 00:00:00
*/
public void selectDocumentDateUseGt(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-01-01 00:00:00");
FindIterable iterable = collection.find(Filters.gt("userbirth",date));
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
String temp=DateUtil.dateToString("yyyy-MM-dd HH:mm:ss",(Date)docu.get("userbirth"));
System.out.println(docu.get("username")+"\t"+docu.get("userage")+"\t"+docu.get("userdesc")+"\t"+docu.get("userlike")+"\t"+temp);
}
}
}
五、聚合操作
package com.bjsxt;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import java.util.ArrayList;
import java.util.List;
public class AggregateOper {
public static void main(String[] args) {
AggregateOper aggregateOper=new AggregateOper();
/*aggregateOper.selectDocumentAggregateCount();*/
/*aggregateOper.selectDocumentAggregateSum();*/
/*aggregateOper.selectDocumentAggregateGroupBySum();*/
/*aggregateOper.selectDocumentAggregateGroupByWhere();*/
aggregateOper.selectDocumentAggregateGroupByHaving();
}
/**
* 需求:查询集合中的文档数量
* db.dev.aggregate([{$group:{_id:null,count:{$sum:1}}}])
*/
public void selectDocumentAggregateCount(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
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 docu = cursor.next();
System.out.println(docu.get("count"));
}
}
/**
* 需求:查询集合中所有 size 键中的值的总和
* db.dev.aggregate([{$group:{_id:null,totalSize:{$sum:"$size"}}}])
*/
public void selectDocumentAggregateSum(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document sum=new Document();
sum.put("$sum","$size");
Document totalSize =new Document();
totalSize.put("_id",null);
totalSize.put("totalSize",sum);
Document group=new Document();
group.put("$group",totalSize);
List<Document> list=new ArrayList<Document>();
list.add(group);
AggregateIterable iterable = collection.aggregate(list);
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("totalSize"));
}
}
/**
* 需求:对 title 进行分组,计算每组中的 size 的总和
* db.dev.aggregate([{$group:{_id:"$title",totalSize:{$sum:"$size"}}}])
*/
public void selectDocumentAggregateGroupBySum(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document sum=new Document();
sum.put("$sum","$size");
Document totalSize=new Document();
totalSize.put("_id","$title");
totalSize.put("totalSize",sum);
Document group=new Document();
group.put("$group",totalSize);
List<Document> list=new ArrayList<Document>();
list.add(group);
AggregateIterable iterable = collection.aggregate(list);
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("totalSize"));
}
}
/**
* 分组前过滤
* 需求:查询 dev 集合有多少文档的 size 大于 200 。
* db.dev.aggregate([{$match:{size:{$gt:200}}},{$group:{_id:null,totalSize:{$sum:1}}}])
*/
public void selectDocumentAggregateGroupByWhere(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document gt=new Document();
gt.put("$gt",200);
Document size=new Document();
size.put("size",gt);
Document match=new Document();
match.put("$match",size);
Document sum=new Document();
sum.put("$sum",1);
Document totalSize=new Document();
totalSize.put("_id",null);
totalSize.put("totalSize",sum);
Document group=new Document();
group.put("$group",totalSize);
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 docu = cursor.next();
System.out.println(docu.get("totalSize"));
}
}
/**
* 需求:查询 dev 集合,根据 title 分组计算出每组的 size 的总和,并过滤掉总和小于 200 的文档。
* db.dev.aggregate([{$group:{_id:"$title",totalSize:{$sum:"$size"}}},{$match:{totalSize:{$gt:200}}}])
*/
public void selectDocumentAggregateGroupByHaving(){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document sum=new Document();
sum.put("$sum","$size");
Document totalSize=new Document();
totalSize.put("_id","$title");
totalSize.put("totalSize",sum);
Document group=new Document();
group.put("$group",totalSize);
Document gt=new Document();
gt.put("$gt",200);
Document mtotalSize=new Document();
mtotalSize.put("totalSize",gt);
Document match=new Document();
match.put("$match",mtotalSize);
List<Document> list=new ArrayList<Document>();
list.add(group);
list.add(match);
AggregateIterable iterable = collection.aggregate(list);
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu.get("totalSize"));
}
}
}
六、分页查询
package com.bjsxt;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.bson.types.ObjectId;
/**
* 分页查询
*/
public class SelectDocumentByPage {
public static void main(String[] args) {
SelectDocumentByPage documentByPage=new SelectDocumentByPage();
/*documentByPage.selectDocumentByPageUseSkipAndLimit(1);*/
documentByPage.selectDocumentByPageUseCondition(2,2,"5dbce2df8224cadebb22704c");
}
/**
* 通过 skip 与 limit 方法实现分页
*/
public void selectDocumentByPageUseSkipAndLimit(Integer pageIndex){
int page=(pageIndex-1)*2;
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document condition=new Document("size",new Document("$ne",null));
long count = collection.countDocuments(condition);
System.out.println(count);//总条数
FindIterable iterable = collection.find(condition).skip(page).limit(2);
MongoCursor<Document> cursor = iterable.iterator();
while(cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu);
}
}
/**
* 通过条件判断优化分页查询
*/
public void selectDocumentByPageUseCondition(int pageIndex,int pagesize,String lastId){
//获取集合
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
Document condition=new Document("size",new Document("$ne",null));
long count = collection.countDocuments(condition);
System.out.println(count);
FindIterable iterable=null;
if (pageIndex==1){
iterable = collection.find(condition).limit(pagesize);
}else {
if (lastId !=null){
condition.append("_id",new Document("$gt",new ObjectId(lastId)));
iterable = collection.find(condition).limit(pagesize);
}
}
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()){
Document docu = cursor.next();
System.out.println(docu);
}
}
}