一、下载
MongoDB提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包
下载地址:
https://www.mongodb.com/download-center/community
二、安装
从 MongoDB 4.0 开始,默认情况下,可以在安装期间配置和启动 MongoDB 作为服务,并在成功安装后启动 MongoDB 服务。
如果你选择不将 MongoDB 配置为服务,请取消选中 Install MongoD as a Service。
如果你选择将 MongoDB 配置为服务,则可以:
指定以下列用户之一运行服务:
网络服务用户;即 Windows 内置的 Windows 用户帐户
本地或域用户:
对于现有本地用户帐户,Account Domain 指定为 .,并为该用户指定 Account Name 和 Account Password。
对于现有域用户,请为该用户指定 Account Domain,Account Name 和 Account Password。
指定 Service Name。如果你已拥有具有指定名称的服务,则必须选择其他名称。
指定 Data Directory(数据保存目录),对应于 --dbpath。如果该目录不存在,安装程序将创建该目录并为服务用户设置访问权限。
指定 Log Directory(日志保存目录),该目录对应于 --logpath。如果该目录不存在,安装程序将创建该目录并为服务用户设置访问权限。
注意:不能选,不能选,不能选。。。(选中之后一个小时不一定能安装完成)
配置环境变量:MONGO_HOME 和Path
配置完成之后启动mongodb
在cmd 下输入 mongo 进行检测安装及配置
基本操作:
创建数据库并切换库:use DATABASE_NAME
删除数据库:db.dropDatabase()
获取所有数据库:show databases 或show dbs
获取库中的所有表:show collections
获取当前位置:db
表中插入数据:db.COLLECTION_NAME.insert(document);
db. COLLECTION_NAME.save(document);
如:db.operateLod.insert({userId:“1”,userName:“zhangsan”});
插入数据时,如果不指定 ”_id” 会自动生成,如果指定,则覆盖。
更新表中的某条数据:
修改最前面的一条:db. COLLECTION_NAME.update({userId:“1”},{$set:{userId:“2”}})
删除数据匹配的所有:db. COLLECTION_NAME.remove({userId:“2”});
获取表中的数据:
获取所有:db. COLLECTION_NAME.find();
按条件获取:db. COLLECTION_NAME.find(document);
安装时遇到的坑:
安装到最后报错:
Service ‘MongoDB Server’ (MongoDB) failed to start. Verify thay you have…
解决办法是:如果点击忽略之后,启动会弹出
安装:vc_redist.x64(有32位和64位之分)
三、项目使用
3.1所需jar
bson-3.12.1.jar
mongodb-driver-3.12.1.jar
mongo-java-driver-3.0.4.jar
spring-data-mongodb-2.2.4.RELEASE.jar
直接代码
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* @author
* @ClassName:
* @Description: 连接数据库对象
* @date
*/
public class MongodbConnect {
/**
* @Title: getConnectMongoDB
* @Description: //TODO 连接数据库
* @author:
* @Param [address, port, dataBaseName, userName, password]
* @date 2020/3/7 10:47
* @return com.mongodb.client.MongoDatabase
* @throws
*/
public static MongoDatabase getConnectMongoDB(String address, int port, String dataBaseName ,String userName, String password){
MongoDatabase mongoDatabase = getConnect(address, port, dataBaseName);
if(userName != null && !"".equals(userName) && password != null && !"".equals(password)){
mongoDatabase = getConnectAuth(address, port, dataBaseName , userName, password);
}
return mongoDatabase;
}
/**
* @Title: getConnect
* @Description: //TODO
* @author:
* @Param [address, port, dataBaseName]
* @date 2020/3/7 10:47
* @return com.mongodb.client.MongoDatabase
* @throws
*/
private static MongoDatabase getConnect(String address, int port, String dataBaseName){
//连接到 mongodb 服务
MongoClient mongoClient = new MongoClient(address, port);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(dataBaseName);
//返回连接数据库对象
return mongoDatabase;
}
/**
* @Title: getConnectAuth
* @Description: //TODO 需要密码认证方式连接
* @author:
* @Param [address, port, dataBaseName, userName, password]
* @date 2020/3/7 10:47
* @return com.mongodb.client.MongoDatabase
* @throws
*/
private static MongoDatabase getConnectAuth(String address, int port, String dataBaseName ,String userName, String password){
List<ServerAddress> adds = new ArrayList<>();
//ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress(address, port);
adds.add(serverAddress);
List<MongoCredential> credentials = new ArrayList<>();
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(userName, dataBaseName, password.toCharArray());
credentials.add(mongoCredential);
//通过连接认证获取MongoDB连接
MongoClient mongoClient = new MongoClient(adds, credentials);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(dataBaseName);
//返回连接数据库对象
return mongoDatabase;
}
}
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.lyrss.util.MQ.MQproducer;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class MongodbUtil {
private String address = "192.168.1.12";
private int port = 27017;
private String dataBaseName = "dataYS"; // 数据库名称
private String dataTable = "operateLog"; // 表名称
private String userName = "";
private String password = "";
//获取数据库连接对象
private MongoDatabase mongoDatabase = MongodbConnect.getConnectMongoDB(address, port, dataBaseName, userName, password);
/**
* @Title: createCollection
* @Description: //TODO 创建集合(表)
* @author:
* @Param [dataTable]
* @date 2020/3/7 10:52
* @return void
* @throws
*/
public void createCollection(String table){
mongoDatabase.createCollection(table);
}
/**
* @Title: saveOneDocument
* @Description: //TODO 添加一条数据
* @author:
* @Param []
* @date 2020/3/6 14:26
* @return void
* @throws
*/
public void saveOneDocument(Object jsonObj ){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
Document document = Document.parse(jsonObj.toString());
//要插入的数据
Document document = toDocument(jsonObj);
//插入一个文档
collection.insertOne(document);
}
/**
* @Title: saveManyTest
* @Description: //TODO 添加list集合
* @author:wangdezhong
* @Param []
* @date 2020/3/6 14:41
* @return void
* @throws
*/
public <T> void saveManyTest(List<T> list){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
//要插入的数据
List<Document> listDoc = new ArrayList<>();
if(list != null && list.size() != 0){
for(int i = 0; i < list.size(); i++) {
Document document = toDocument(list.get(i));
listDoc.add(document);
}
}
//插入多个文档
collection.insertMany(listDoc);
}
/**
* @Title: getAllData
* @Description: //TODO 获取表中的所有数据
* @author:
* @Param []
* @date 2020/3/6 18:09
* @return void
* @throws
*/
public List<OperateLog> getAllData(int page, int rows, String sort, String startTime, String endTime, Long userId, String type){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
//按时间段查询
BasicDBObject query = new BasicDBObject();
if(startTime != null && !"".equals(startTime)){
query.put("createTime", new BasicDBObject("$gte",startTime).append("$lt", endTime));
}
if(userId != null && userId != 0){
query.put("userId",userId);
}
if(type != null && !"".equals(type) && !"请选择".equals(type)){
query.put("type",type);
}
int pageSize = (page-1)*rows;
//limit 查询几条 ,skip 跳过几条 ,sort 按什么排序
FindIterable<Document> documents = collection.find(query).limit(rows).skip(pageSize).sort(new Document("createTime", sort.equalsIgnoreCase("asc") ? 1 :-1));//1 为升序排列,而 -1 是用于降序排列
long count = collection.count(query);
Gson gson = new Gson();
MongoCursor<Document> mongoCursor = documents.iterator();
List<Object> objects = new ArrayList<Object>();
int n=0;
while(mongoCursor.hasNext()){
objects.add(mongoCursor.next());
n++;
}
List<OperateLog> logList = new ArrayList<OperateLog>();
//json解析
for (Object object:objects){
String json = gson.toJson(object);
OperateLog log = gson.fromJson(json, OperateLog.class);
logList.add(log);
}
return logList;
}
/**
* @Title: getCount
* @Description: //TODO 统计总条数
* @author:
* @Param []
* @date 2020/3/7 14:27
* @return java.lang.Long
* @throws
*/
public Long getCount(String startTime, String endTime, Long userId, String type){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
//按时间段查询
BasicDBObject query = new BasicDBObject();
if(startTime != null && !"".equals(startTime)){
query.put("createTime", new BasicDBObject("$gte",startTime).append("$lt", endTime));
}
if(userId != null && userId != 0){
query.put("userId",userId);
}
if(type != null && !"".equals(type) && !"请选择".equals(type)){
query.put("type",type);
}
long count = collection.count(query);
return count;
}
/**
* @Title: getFirstData
* @Description: //TODO 获取第一条数据
* @author:
* @Param []
* @date 2020/3/6 14:44
* @return void
* @throws
*/
public void getFirstData(){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
//查找集合中的所有文档
FindIterable findIterable = collection.find();
//取出查询到的第一个文档
Document document = (Document) findIterable.first();
//打印输出
System.out.println(document);
}
/**
* @Title: toDocument
* @Description: //TODO 将对象转为document
* @author:
* @Param [object]
* @date 2020/3/6 17:56
* @return org.bson.Document
* @throws
*/
public <T> Document toDocument(T object){
String json = JSON.toJSONString(object);
Document document = Document.parse(json);
return document;
}
public static void main(String[] args) {
//测试略
}
}
二次优化
mongodb.properties
mongodb.address=127.0.0.1
mongodb.port=27017
#数据库名称
mongodb.dataBaseName=dataYS
#用户名和密码
mongodb.userName=dataYS
mongodb.password=dataYS
#线程池中连接的最大空闲时间, 0标志Udine空闲时间没有限制,超过这个时间会被关闭.
mongodb.maxConnectionIdleTime=0
#线程池中连接的最长生存时间. 0表示没有限制. 超过寿命的会被关闭,必要时通过新连接进行替换
mongodb.maxConnectionLifeTime=0
#每个host允许链接的最大链接数,这些链接空闲时会放入池中,如果链接被耗尽,任何请求链接的操作会被阻塞等待链接可用,推荐配置10
mongodb.connectionsPerHost=10
#一个线程等待链接可用的最大等待毫秒数,0表示不等待,负数表示等待时间不确定,推荐配置120000
mongodb.maxWaitTime=120000
#链接超时的毫秒数,0表示不超时,此参数只用在新建一个新链接时,推荐配置30000.
mongodb.connectTimeout=30000
#此参数表示socket I/O读写超时时间,推荐为不超时,即 0 Socket.setSoTimeout(int)
mongodb.socketTimeout=0
import com.lyrss.util.CheckDataUtil;
import com.lyrss.util.PropertiesUtilsAll;
import com.lyrss.util.Tools;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* @author
* @ClassName:
* @Description: 连接数据库对象
* @date
*/
public class MongodbConnect {
//获取配置文件 mongodb.properties
protected static Properties pprVue = getPprVue();
public static MongoDatabase getConnectMongoDB(){
if(CheckDataUtil.isNotEmptyString(pprVue.getProperty("mongodb.userName"))){
return getConnectAuthAndBuild();
}
return getConnect();
}
/**
* @Title: getConnect
* @Description: //TODO 不需要认证
* @Param [address, port, dataBaseName]
* @date 2020/3/7 10:47
* @return com.mongodb.client.MongoDatabase
* @throws
*/
private static MongoDatabase getConnect(){
// 客户端配置
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.maxConnectionIdleTime(Integer.parseInt(pprVue.getProperty("mongodb.maxConnectionIdleTime")));
builder.maxConnectionLifeTime(Integer.parseInt(pprVue.getProperty("mongodb.maxConnectionLifeTime")));
builder.connectionsPerHost(Integer.parseInt(pprVue.getProperty("mongodb.connectionsPerHost")));
builder.maxWaitTime(Integer.parseInt(pprVue.getProperty("mongodb.maxWaitTime")));
builder.connectTimeout(Integer.parseInt(pprVue.getProperty("mongodb.connectTimeout")));
builder.socketTimeout(Integer.parseInt(pprVue.getProperty("mongodb.socketTimeout")));
MongoClientOptions mongoClientOptions = builder.build();
String host = pprVue.getProperty("mongodb.address")+ ":" +Integer.parseInt(pprVue.getProperty("mongodb.port"));
//连接到 mongodb 服务
MongoClient mongoClient = new MongoClient(host, mongoClientOptions);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(pprVue.getProperty("mongodb.dataBaseName"));
//返回连接数据库对象
return mongoDatabase;
}
/**
* @Title: getConnectAuthAndBuild
* @Description: //TODO 需要密码认证方式连接
* @Param [address, port, dataBaseName, userName, password]
* @date 2020/4/10 16:15
* @return org.springframework.data.mongodb.MongoDbFactory
* @throws
*/
private static MongoDatabase getConnectAuthAndBuild(){
// 客户端配置
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.maxConnectionIdleTime(Integer.parseInt(pprVue.getProperty("mongodb.maxConnectionIdleTime")));
builder.maxConnectionLifeTime(Integer.parseInt(pprVue.getProperty("mongodb.maxConnectionLifeTime")));
builder.connectionsPerHost(Integer.parseInt(pprVue.getProperty("mongodb.connectionsPerHost")));
builder.maxWaitTime(Integer.parseInt(pprVue.getProperty("mongodb.maxWaitTime")));
builder.connectTimeout(Integer.parseInt(pprVue.getProperty("mongodb.connectTimeout")));
builder.socketTimeout(Integer.parseInt(pprVue.getProperty("mongodb.socketTimeout")));
MongoClientOptions mongoClientOptions = builder.build();
// MongoDB地址列表
List<ServerAddress> serverAddresses = new ArrayList<>();
ServerAddress serverAddress = new ServerAddress(pprVue.getProperty("mongodb.address"), Integer.parseInt(pprVue.getProperty("mongodb.port")));
serverAddresses.add(serverAddress);
// 连接认证
List<MongoCredential> mongoCredentialList = new ArrayList<>();
if (CheckDataUtil.isNotEmptyString(pprVue.getProperty("mongodb.userName"))) {
mongoCredentialList.add(MongoCredential.createScramSha1Credential(
pprVue.getProperty("mongodb.userName"),//用户名
pprVue.getProperty("mongodb.dataBaseName"),//数据库名称
pprVue.getProperty("mongodb.password").toCharArray()));//密码
}
// 创建客户端和Factory
MongoClient mongoClient = new MongoClient(serverAddresses,mongoCredentialList, mongoClientOptions);
MongoDatabase mongoDatabase = mongoClient.getDatabase(pprVue.getProperty("mongodb.dataBaseName"));
return mongoDatabase;
}
/**
* @Title: getPprVue
* @Description: //TODO 获取服务器版本
* @Param []
* @date 2020/3/27 8:29
* @return java.util.Properties
* @throws
*/
private static Properties getPprVue(){
String severVersion = PropertiesUtilsAll.getProperties("resources/system.properties").getProperty("severVersion");
String redisProperties = "";
if(severVersion.equals("alpha")){
redisProperties = "resources/alpha/mongodb.properties";
}else if(severVersion.equals("rc")){
redisProperties = "resources/rc/mongodb.properties";
}else{
redisProperties = "resources/release/mongodb.properties";
}
InputStream inputStream = Tools.class.getClassLoader().getResourceAsStream(redisProperties);
Properties p = new Properties();
try {
p.load(inputStream);
inputStream.close();
} catch (IOException e) {
//读取配置文件出错
e.printStackTrace();
}
return p;
}
}
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.lyrss.util.PropertiesUtilsAll;
import com.lyrss.util.Tools;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class MongodbUtil {
private String dataTable = "operateLog"; // 表名称
//获取数据库连接对象
private MongoDatabase mongoDatabase = MongodbConnect.getConnectMongoDB();
//这里没有添加的代码和之前的是一样的
/**
* @Title: getAllData
* @Description: //TODO 获取表中的所有数据
* @author:wangdezhong
* @Param []
* @date 2020/3/6 18:09
* @return void
* @throws
*/
public List<OperateLog> getAllData(int page, int rows, String sort, String startTime, String endTime, Long userId,
String type, String ipAddr, String clientType){
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection(dataTable);
//按时间段查询
BasicDBObject query = new BasicDBObject();
if(startTime != null && !"".equals(startTime)){
query.put("createTime", new BasicDBObject("$gte",startTime).append("$lt", endTime));
}
if(userId != null && userId != 0){
query.put("userId",userId);
}
if(type != null && !"".equals(type) && !"请选择".equals(type)){
query.put("type",type);
}
if(ipAddr != null && !"".equals(ipAddr)){
query.put("ipAddr",ipAddr);
}
if(clientType != null && !"".equals(clientType)){
query.put("clientType",clientType);
}
int pageSize = (page-1)*rows;
//limit 查询几条 ,skip 跳过几条 ,sort 按什么排序 ,projection(new BasicDBObject("userId",0)) 0 字段不查询、1 查询,
FindIterable<Document> documents = collection.find(query)
.projection(new BasicDBObject("userId",0).append("userType", 0).append("type", 0).append("state", 0)
.append("delFlag", 0).append("authType", 0).append("host", 0))
.limit(rows).skip(pageSize).sort(new Document("_id", sort.equalsIgnoreCase("asc") ? 1 :-1));//1 为升序排列,而 -1 是用于降序排列
Gson gson = new Gson();
MongoCursor<Document> mongoCursor = documents.iterator();
List<OperateLog> logList = new ArrayList<OperateLog>();
while(mongoCursor.hasNext()){
logList.add(gson.fromJson(gson.toJson(mongoCursor.next()), OperateLog.class));
}
return logList;
}
}