參考網站:http://www.runoob.com/mongodb/mongodb-linux-install.html
1.下載
https://www.mongodb.com/download-center/community
我下載的Linux版本 4.0.8 release版本

.tgz文件,通過rz命令上傳到linux服務器
>tar -zxvf mongodb-linux-x86_64-4.0.8.tgz 解壓
>mv mongodb-linux-x86_64-4.0.8 /
2.配置環境變量
將mongodb/bin目錄加入到path
>vi /etc/profile
# Mongodb Config export MONGODB_HOME=/mongodb-linux-x86_64-4.0.8 export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$MONGODB_HOME/bin:$PATH
>source /etc/profile
3.創建數據庫目錄
MongoDB的數據存儲在data目錄的db目錄下,但是這個目錄在安裝過程不會自動創建,所以你需要手動創建data目錄,並在data目錄中創建db目錄。
以下實例中我們將data目錄創建於根目錄下(/)。
注意:/data/db 是 MongoDB 默認的啟動的數據庫路徑(--dbpath)。
mkdir -p /mongodb-linux-x86_64-4.0.8/data/mongodata 數據庫存放目錄
mkdir -p /mongodb-linux-x86_64-4.0.8/data/mongologs\mongo.log 日志存放目錄
4.啟動mongodb服務
>cd bin
>./mongod

好慢,日志在慢慢打印,以為啟動成功了,可瀏覽器訪問不了:
http://192.168.1.197:28017
可查看端口,顯示
> netstat -lanp | grep "27017"

顯示啟動成功了,
>./mongo 連接客戶端,

顯示連接成功了,
原來
./mongod是啟動服務
./mongo是啟動客戶端
但http://192.168.1.197:28017 還是訪問不了,不知道默認端口是啥,明天再研究下。
5.配置使用過程中遇到的一些問題:
把配置信息寫到配置文件中,啟動服務時指定文件:
>./mongod -f ../mongodb.conf
關閉服務:指定配置文件
mongod --shutdown -f ../mongodb.conf
配置文件如下,在mongodb主目錄下:
##端口 port=27017 ##數據文件路徑 需自己創建 dbpath=/mongodb-linux-x86_64-4.0.8/data/mongodata ##日志文件路徑 需自己創建 logpath=/mongodb-linux-x86_64-4.0.8/data/mongologs/mongodb.log ##日志文件是否追加 logappend=true #以后台方式運行進程 #fork=true #開啟用戶認證 auth=true #關閉http接口,默認關閉http端口訪問 #httpinterface=true #mongodb所綁定的ip地址 bind_ip =0.0.0.0 #啟用日志文件,默認啟用 journal=true #這個選項可以過濾掉一些無用的日志信息,若需要調試使用請設置為false quiet=true
客戶端連接:
>./mongo
命令區別:
./mongod 啟動mongodb服務
./mongo 客戶端連接服務
>show dbs; 顯示所有數據庫
> use hz_studentroll; 如果數據已經存在,切換到該數據庫,使用該數據庫;如果不存在,創建該數據庫
> db 顯示當前數據庫
hz_studentroll
如果真的想把這個數據庫創建成功,那么必須插入一個數據。
數據庫中不能直接插入數據,只能往集合(collections)中插入數據。不需要專門創建集合,只 需要寫點語法插入數據就會創建集合:
db.data_sys_log.insert({"name":"測試"})
db.data_sys_log 系統發現 data_sys_log 是一個陌生的集合名字,所以就自動創建了集合。
集合,就相當於mysql中的表
但是,卻報錯:
WriteCommandError
not authorized on hz_studentroll to execute command

看錯誤信息,好像是沒有授權的意思
用java連接mongodb服務器,往里寫數據:報錯信息:
java.lang.NoSuchMethodError: org.springframework.util.Assert.isInstanceOf(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/Supplier;)V
網上說把spring-data-mongodb的包從2.x換成1.x,
我mongodb安裝的是4.0.8,spring用的是4.3.7,不想把spring-data-mongodb降版本呢,網上說spring-data-commons包沖突,一查,果然redis里也有spring-data-commons包,
一個是2.x,一個是1.x

Interrupted acquiring a permit to retrieve an item from the pool

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoMappingContext':
Failed to introspect bean class [org.springframework.data.mongodb.core.mapping.MongoMappingContext]
for lookup method metadata: could not find class that it depends on; nested exception is java.lang.NoClassDefFoundError:
org/springframework/data/mapping/model/Property
Caused by: java.lang.NoSuchMethodError: org.springframework.data.mongodb.core.MongoTemplate.save(Ljava/lang/Object;Ljava/lang/String;)V
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError:
org.springframework.data.mongodb.core.MongoTemplate.save(Ljava/lang/Object;)V
各種報錯,無論怎么搞都調用不了 MongoTemplate的insert,save方法
網上查的結果都是說要把版本從2.x降到1.x,可我降了,還是沒用
想着調不通,就寫個spring測試類利用spring-test和junit測試一下
"errmsg" : "command update requires authentication" , "code" : 13 , "codeName" : "Unauthorized"
意思是沒用授權,我才想起來,我配置文件加了 auth=true 這句,把這句注釋掉,重新啟動,再測試就OK了
錯誤信息誤報啊,浪費大把的時間。
org.springframework.dao.DataAccessResourceFailureException: Timed out after 1000 ms while waiting to connect.
Client view of cluster state is {type=Unknown, servers=[{address=192.168.1.197:27017, type=Unknown, state=Connecting,
exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.ConnectException: Connection refused: connect}}];
nested exception is com.mongodb.MongoTimeoutException: Timed out after 1000 ms while waiting to connect.
Client view of cluster state is {type=Unknown, servers=[{address=192.168.1.197:27017, type=Unknown, state=Connecting,
exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.ConnectException:
Connection refused: connect}}]
服務停了,重啟下就好了。
mongod通過以下命令啟動,每天連接中斷了,服務也停了,又要重啟,每天早上來,要先啟服務,也是麻煩。
>./mongod -f ../mongo.conf
想辦法把它做成服務吧。
6.Linux下注冊mongodb服務
進入 /etc/init.d/ 目錄
>cd /etc/init.d/
創建mongodb文件
>vim mongodb
#!/bin/sh # # ### BEGIN INIT INFO # Short-Description: mongodb # Description: mongo db server ### END INIT INFO PROGRAM=/mongodb-linux-x86_64-4.0.8/bin/mongod MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'` test -x $PROGRAM || exit 0 case "$1" in start) ulimit -n 3000 echo "Starting MongoDB server" $PROGRAM --fork --quiet -f /mongodb-linux-x86_64-4.0.8/mongodb.conf echo "Started MongoDB server" ;; stop) echo "Stopping MongoDB server" if [ ! -z "$MONGOPID" ]; then kill -15 $MONGOPID fi echo "Stopped MongoDB server" ;; status) ;; *) echo "Usage: mongodb {start|stop|status}" exit 1 esac exit 0
保存完畢,在執行以下幾條命令即可:
# chmod +x /etc/init.d/mongodb # chkconfig --add mongodb # chkconfig mongodb on

執行報:mongodb 服務不支持 chkconfig
在vim mongodb開機腳本文件頭加上下面兩句,再執行就好了
#chkconfig: 2345 80 90 #description:auto_run
就可以用服務命令啟動mongodb服務了
>service mongodb start 啟動服務
>service mongodb stop 停止服務
>service mongodb status 查看狀態
7.java中使用mongodb讀寫數據
1)多個字段排序:用query.with...and
query.with(new Sort(new Order(Direction.DESC, "sort"))
.and(new Sort(Direction.DESC,"ct")));
mongo基礎接口類:MongoDao
import java.util.List; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; public interface MongoDao { public <T> List<T> find(Class<T> clazz); public <T> T findOne(Query query, Class<T> clazz); public <T> void update(Query query, Update update, Class<T> T); //批量更新 public <T> void updatemulti(Query query, Update update, Class<T> clazz); public <T> void save(T entity); public <T> void save(T entity,String collectionName); public <T> T findById(String id, Class<T> clazz); public <T> long count(Query query, Class<T> clazz); public <T> void remove(Query query, Class<T> clazz); }
具體業務實現類:
import java.util.Date; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.transaction.annotation.Transactional; import com.mongodb.WriteResult; import com.uws.base.model.SysLogMongo; import com.uws.commons.utils.DateTools; import com.uws.commons.utils.PageInfo; import com.uws.commons.utils.StringUtils; @Transactional(rollbackFor=Exception.class) public class SysLogMongoDao<T> implements MongoDao{ @Autowired private MongoTemplate mongoTemplate; @Override public <T> List<T> find(Class<T> clazz) { return mongoTemplate.findAll(clazz); } @Override public <T> T findOne(Query query, Class<T> clazz) { return mongoTemplate.findOne(query, clazz); } @Override public <T> void update(Query query, Update update, Class<T> T) { mongoTemplate.updateFirst(query, update, T); } @Override public <T> void updatemulti(Query query, Update update, Class<T> clazz) { mongoTemplate.updateMulti(query, update, clazz); } @Override public <T> void save(T entity) { mongoTemplate.save(entity); } @Override public <T> T findById(String id, Class<T> clazz) { return mongoTemplate.findById(id, clazz); } @Override public <T> long count(Query query, Class<T> clazz) { return mongoTemplate.count(query, clazz); } @Override public <T> void remove(Query query, Class<T> clazz) { mongoTemplate.remove(query, clazz); } @Override public void save(Object objectToSave, String collectionName) { mongoTemplate.save(objectToSave, collectionName); } public void findByPage(PageInfo pageInfo,Class clazz, String collectionName) { Query query = Query.query(Criteria.where("loginName").is("系統管理員")); // 每頁五個 //mongodb頁面從0開始 Pageable pageable = new PageRequest(pageInfo.getNowpage()-1, pageInfo.getPagesize()); query.with(pageable); // 排序 query.with(new Sort(Direction.DESC, "createTime")); // 查詢總數 int count = (int) mongoTemplate.count(query, clazz, collectionName); List list = (List) mongoTemplate.find(query, clazz, collectionName); pageInfo.setRows(list); pageInfo.setTotal(count); } public void insertOne(Object object) { this.mongoTemplate.insert(object); } /** * 系統日志刪除 * @param flag * @return */ public boolean deleteSysLog(String flag) { int result=-1; if("all".equals(flag)) { Query query = new Query(); WriteResult res = this.mongoTemplate.remove(query, "data_sys_log"); result = res.getN(); }else {//最近三個月 Date dateTime = DateTools.addMonth(new Date(),-3); Query query = Query.query(Criteria.where("createTime").lte(dateTime)); WriteResult res = this.mongoTemplate.remove(query, "data_sys_log"); result = res.getN(); } return result>=0; } public void findByPage(PageInfo pageInfo, SysLogMongo syslogVo, String collectionName) { Criteria criteria = new Criteria(); Criteria criteriaName = new Criteria(); Criteria criteriaIp = new Criteria(); Criteria criteriaTime = new Criteria(); Query query = new Query(); if(StringUtils.isNotBlank(syslogVo.getLoginName())){ criteriaName = Criteria.where("loginName").is(syslogVo.getLoginName()); } if(StringUtils.isNotBlank(syslogVo.getClientIp())) { criteriaIp = Criteria.where("clientIp").is(syslogVo.getClientIp()); } if(syslogVo.getStartTime()!=null && syslogVo.getEndTime()!=null) { criteriaTime = Criteria.where("createTime").gte(syslogVo.getStartTime()).lte(syslogVo.getEndTime()); }else if(syslogVo.getStartTime()!=null && syslogVo.getEndTime()==null) { criteriaTime = Criteria.where("createTime").gte(syslogVo.getStartTime()); }else if(syslogVo.getStartTime()==null && syslogVo.getEndTime()!=null) { criteriaTime = Criteria.where("createTime").lte(syslogVo.getEndTime()); } criteria.andOperator(criteriaName,criteriaIp,criteriaTime); query.addCriteria(criteria); //mongodb頁面從0開始 Pageable pageable = new PageRequest(pageInfo.getNowpage()-1, pageInfo.getPagesize()); query.with(pageable); // 排序 if(StringUtils.isNotBlank(pageInfo.getSort()) && StringUtils.isNotBlank(pageInfo.getOrder())) { Sort sort = new Sort(pageInfo.getSort(),pageInfo.getOrder()); query.with(sort); } // 查詢總數 int count = (int) mongoTemplate.count(query, SysLogMongo.class, collectionName); List list = (List) mongoTemplate.find(query, SysLogMongo.class, collectionName); pageInfo.setRows(list); pageInfo.setTotal(count); } }
注意:mongondb分頁是從0開始的,我前台傳參數是從1開始,所以要-1
MongoService基礎服務類:
import java.util.Map; import com.uws.commons.utils.PageInfo; public interface MongoService { public void save(Object object); public void save(Object object,String collectionName); /** * 沒有查詢條件,不排序,查詢所有的 * @param pageInfo * @param clazz * @param collectionName */ public void findByPage(PageInfo pageInfo,Class clazz, String collectionName); /** * 有查詢條件,有排序字段 * @param pageInfo * @param clazz * @param collectionName * @param parameter * @param order */ public void findByPage(PageInfo pageInfo,Class clazz, String collectionName,Map parameter,Map order); }
具體服務類:
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.uws.base.model.SysLogMongo; import com.uws.commons.mongo.dao.SysLogMongoDao; import com.uws.commons.utils.PageInfo; public class SysLogMongoService implements MongoService{ @Autowired private SysLogMongoDao mongoDao; public void save(Object object) { this.mongoDao.insertOne(object); } public void save(Object object,String collectionName) { this.mongoDao.save(object,collectionName); } /** * @param pageInfo * @param clazz * @param collectionName */ public void findByPage(PageInfo pageInfo,Class clazz, String collectionName){ this.mongoDao.findByPage(pageInfo,clazz,collectionName); } /** * 有查詢條件,有排序字段 * @param pageInfo * @param clazz * @param collectionName * @param parameter * @param order */ public void findByPage(PageInfo pageInfo,Class clazz, String collectionName,Map parameter,Map order){ this.mongoDao.findByPage(pageInfo,clazz,collectionName,parameter,order); } public boolean deleteSysLog(String flag) { return this.mongoDao.deleteSysLog(flag); } public void findByPage(PageInfo pageInfo, SysLogMongo syslogVo, String collectionName) { this.mongoDao.findByPage(pageInfo, syslogVo, collectionName); } }
