mongodb單機搭建


參考網站: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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM