0、mongoDB开启运程调用
- 在配置文件中加入
- 如果想远程连接mongoDB数据库
必须在/usr/local/mongodb/etc/mongodb.conf ,加上最后一行!!!
bind_ip=0.0.0.0 #允许连接的ip
[root@node0 etc]#
vim mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
port=27017
fork=true
auth=true
bind_ip=0.0.0.0 #允许连接的ip
1、建立maven 项目
2、添加依赖:
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
</dependencies>
3、建一个类:这个类是操作数据库的工具类,并且使用了池和用户验证
package com.hyc;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
/**
* 类说明:基于池的连接mongodb,加上用户认证!
*
* @author hyc
* @version 1.0
* @date 2021/11/14 22:27
*/
public class MongoDBAuthPoolUtil {
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", "develop", "itsxtpwd".toCharArray());
// 数据库地址
ServerAddress address = new ServerAddress("192.168.2.130", 27017);
client = new MongoClient(address, credential, builder.build());
}
}
//获取 MongoDB 数据库
public static MongoDatabase getDatabase(String dbName) {
return client.getDatabase(dbName);
}
//获取 MongoDB 中的集合
public static MongoCollection getCollection(String dbName, String collName) {
MongoDatabase database = getDatabase(dbName);
return database.getCollection(collName);
}
//创建集合
public static void createCollection(String dbName, String collName) {
MongoDatabase database = getDatabase(dbName);
database.createCollection(collName);
}
//删除集合
public static void dropCollection(MongoCollection coll) {
coll.drop();
}
}
4、测试
package com.hyc;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.util.Arrays;
/**
* 类说明:mongodb 用户验证的方式
*
* @author hyc
* @version 1.0
* @date 2021/11/14 20:58
*/
public class MongoDBDemo {
public static void main(String[] args) {
inesrtSingleDocument(); // 方法调用
}
/**
* 添加单个文档
*/
public static void inesrtSingleDocument() { //获取集合 dbName:数据库名称 collName :集合名称;相当于数据库中的表
MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "dev");
// {}---->Document
//append(String key,Object value)---->{key:value}
Document docu = new Document();
docu.append("username", "王武").append("userage", 26).
append("userdesc", "Very Good").append("userlike", Arrays.asList(new String[]{"Music", "Sport"}));
collection.insertOne(docu);
}
}
package com.hyc;
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 org.junit.Test;
import org.omg.CORBA.IRObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* 类说明:对于文档的各种操作
*
* @author hyc
* @version 1.0
* @date 2021/11/15 14:37
*/
public class MongoDBAuthPoolUtilTest {
private MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
/**
* 文档的单个添加
*/
@Test
public void insertOne() {
Document docu = new Document();
docu.append("username", "王武").append("userage", 26).append("userdesc", "Very Good").append("userlike", Arrays.asList(new String[]{"Music", "Sport"}));
collection.insertOne(docu);
}
/**
* 文档的批量添加
*/
@Test
public void insertManyDocument() {
// 获取到集合连接
// MongoCollection collection = MongoDBAuthPoolUtil.getCollection("develop", "devtest");
// 创建集合进行装入数据
List<Document> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
// 文档数据
Document docu = new Document();
docu.append("username", "zhangsan" + i);
docu.append("userage", 20 + i);
docu.append("userdesc", "OK" + i);
docu.append("userlike", Arrays.asList(new String[]{"Music", "Sport"}));
list.add(docu);
}
collection.insertMany(list);
}
/**
* 修改单个数据
*/
@Test
public void updateData() {
//Filters 封装了条件的一个工具类{$set:{userage:28}},把lisi的年龄改为28
collection.updateOne(Filters.eq("username", "lisi"), new Document("$set", new Document("userage", 28)));
}
/**
* 更新单个文档多个键
* Filters.eq()方法
*/
@Test
public void updateSingleDocumentManyKey() {
collection.updateOne(Filters.eq("username", "zhangsan0"), new Document("$set", new Document("userage", 18).append("userdesc", "Very Good")));
}
/**
* 更新多个文档单个键
* Filters.ne()方法
*/
@Test
public void updateManyDocumentSingleKey() {
collection.updateMany(Filters.ne("username", null), new Document("$set", new Document("userdesc", "Very Good")));
}
/**
* 更新多个文档多个键
*/
@Test
public void updateManyDocumentManyKey() {
collection.updateMany(Filters.ne("username", null), new Document("$set", new Document("userdesc", "OK").append("userage", 20)));
}
/**
* 更新文档中的数组
* {$push:{}} 添加一个值
*/
@Test
public void updateDocumentArray() {
collection.updateOne(Filters.eq("username", "lisi"), new Document("$push", new Document("userlike", "Art")));
}
/**
* 查询全部文档
*/
@Test
public void selectDocumentAll() {
FindIterable<Document> iterable = collection.find();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document document = cursor.next();
System.out.println(document.get("username") + "\t" + document.get("userage") + "\t" + document.get("userdesc") + "\t" + document.get("userlike")+"\t"+document.get("userbirth"));
}
}
/**
* 根据_id 查询文档
*/
@Test
public void selectDocumentById() {
FindIterable<Document> iterable =
collection.find(Filters.eq("_id", new ObjectId("61920279062aaa3f308b54e3")));
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"));
}
}
/**
* 根据年龄查询文档,条件是年龄大于 19
*/
@Test
public void selectDocumentConditionByGt() {
FindIterable iterable = collection.find(Filters.gt("userage", 19));
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"));
}
}
/**
* 插入系统当前日期
*/
@Test
public void insertDocumentSystemDate() {
Document docu = new Document();
docu.put("username", "找刘");
docu.put("userage", 22);
docu.put("userdesc", "Very Good");
docu.put("userlike", Arrays.asList(new String[]{"Music", "Art"}));
//系统时间
docu.put("userbirth", new Date());
collection.insertOne(docu);
}
/**
* 插入指定日期
*/
@Test
public void insertDocumentCustDate() {
Date date = DateUtil.stringToDate("yyyy-MM-dd HH:mm:ss", "2019-11-15 13:32:11");
Document docu = new Document();
docu.put("username", "zhaoliu");
docu.put("userage", 24);
docu.put("userdesc", "Very Good");
docu.put("userlike", Arrays.asList(new String[]{"Music", "Art"}));
docu.put("userbirth", date);
collection.insertOne(docu);
}
}
5、聚合查询
package com.hyc;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import jdk.nashorn.tools.Shell;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.Test;
import java.nio.channels.Pipe;
import java.util.ArrayList;
import java.util.List;
/**
* 类说明:
*
* @author hyc
* @version 1.0
* @date 2021/11/15 15:29
*/
public class AggregateFindTest {
MongoCollection collection =
MongoDBAuthPoolUtil.getCollection("develop", "dev");
/**
* 通过条件判断实现分页
* $ne:!= 不等于的意思
* $gt :> 大于
*/
@Test
public void selectDocumentByPageUseCondition() {
int pageIndex = 1; // 第几页
int pageSize = 2;// 每页条数
String lastId = null; // 最后文档的id
Document condition = new Document("size", new Document("$ne", null));
//查询条数
long countNum = collection.countDocuments(condition);
// 打印条数
System.out.println(countNum);
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);
}
}
/**
* 通过 skip 与 limit 方法实现分页
*/
@Test
public void selectDocumentByPageUseSkipAndLimit() {
int pageIndex = 1;
int page = (pageIndex - 1) * 2;
Document condition = new Document("size", new Document("$ne", null));
// 总页数
long countNum = collection.countDocuments(condition);
System.out.println(countNum);
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);
}
}
/**
* 需求:查询集合中所有size的总和
* mongo shell : db.dev.aggregate([{$group:{_id :null,totalSize:{$sum:"$size"}}}])
*/
@Test
public void selectDocumentAggregateSum() {
Document sum = new Document();
sum.put("$sum", "$size");
Document totelSize = new Document();
totelSize.put("_id", null);
totelSize.put("totalSize", sum);
Document group = new Document();
group.put("$group", totelSize);
ArrayList<Object> list = new ArrayList<>();
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"));
}
}
/**
* 需求:查询集合中的文档数量,每一个{}相当于一个document
* Mongo Shell: db.dev.aggregate([{$group:{_id:null,count:{$sum:1}}}])
*/
@Test
public void selectDocumentAggregateCount() {
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<>();
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"));
}
}
}