参考网站: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);
}
}

mongodb单机搭建的更多相关文章

  1. MongoDB单机, 主从, 分布式部署

    MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的.本文介绍一下MongoDB各种部署方式,并分享一些感受.前两部分“单机部署”和“主从部署”是“分片部署”的基础 ...

  2. 单机搭建Android开发环境(二)

    前文介绍了如何优化SSD和内存,以发挥开发主机的最佳性能,同时提到在SSD上创建虚拟机.为什么不装双系统呢?双系统性能应该会更好!采用Windows+虚拟机的方式,主要是考虑到安卓开发和日常办公两方面 ...

  3. 单机搭建Android开发环境(四)

    单机搭建安卓开发环境,前三篇主要是磨刀霍霍,这一篇将重点介绍JDK.REPO.GIT及编译工具的安装,下载项目代码并编译.特别说明,以下操作基于64位12.04 Server版Ubuntu.若采用其他 ...

  4. 单机搭建Android开发环境(三)

    单机搭建Android开发环境,第一篇重点介绍了如何优化Windows 7系统,以提高开发主机的性能并延长SSD的使用寿命.第二篇重点介绍了基于VMWare安装64位版的Ubuntu 12.04,并安 ...

  5. Kafka 概念、单机搭建与使用

    目录 Kafka 概念.单机搭建与使用 基本概念介绍 Topic Producer Consumer Kafka单机配置,一个Broker 环境: 配置zookeeper 配置Kafka 使用Kafk ...

  6. Mongodb - 切片搭建

    0.概述 mongodb分片搭建,版本号4.0.2,以下除了创建opt文件夹以外,所有操作均在mongodb用户下面执行 准备三台机器:192.168.56.81192.168.56.82192.16 ...

  7. MongoDB单机部署

    MongoDB单机部署 一.环境 系统:centos7.6 DB版本:mongodb-linux-x86_64-rhel62-4.2.1.tgz 官网地址:https://www.mongodb.co ...

  8. 《OD大数据实战》MongoDB环境搭建

    一.MongonDB环境搭建 1. 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 2. 解压 tar -zxvf ...

  9. 【MongoDB】MongoDB服务器搭建(Unix/Linux)

    1.安装MongboDB安装包(开源免费的哟) 在Mac 下 brew install mongoDB 就可以啦 安装要等一会儿,大概200M 2. cd到MongboDB文件夹 - 如果是用home ...

随机推荐

  1. DP————LIS(最长上升子序列)和LCS(最长公共子序列)问题

    LIS问题 https://www.acwing.com/problem/content/898/ 思路:首先数组a中存输入的数(原本的数),开辟一个数组f用来存结果,最终数组f的长度就是最终的答案: ...

  2. 华三F100系列防火墙 、华为USG6300系列防火 GRE 隧道配置

    GRE概述: 通用路由封装(GRE: Generic Routing Encapsulation)是通用路由封装协议,可以对某些网络层协议的数据报进行封装,使这些被封装的数据报能够在IPV4网络中传输 ...

  3. Pulse Secure 任意文件读取(CVE-2019-11510)漏洞

    漏洞分析 我们可以通过CVE-2019-11510这个未授权的任意文件读取漏洞把以下文件下载回来. /etc/passwd /etc/hosts /data/runtime/mtmp/system / ...

  4. D3画完整柱状图(带坐标轴、标签)

    昨天晚上本来打算花一点时间把之前学的柱状图改一下,用CSV文件来替换自定义数据.这一替换可不得了,一晚上就搭进去了,还好今早找到了问题的所在,原因在于我的数据引用出了问题. 现在就来讲解一下如何画一个 ...

  5. 【并行计算-CUDA开发】GPGPU OpenCL/CUDA 高性能编程的10大注意事项

    GPGPU OpenCL/CUDA 高性能编程的10大注意事项 1.展开循环 如果提前知道了循环的次数,可以进行循环展开,这样省去了循环条件的比较次数.但是同时也不能使得kernel代码太大. 循环展 ...

  6. 论文阅读 | Adversarial Example Generation with Syntactically Controlled Paraphrase Networks

    [pdf] [code] 句法控制释义网络 SCPNS  生成对抗样本 我们提出了句法控制意译网络(SCPNs),并利用它们来生成对抗性的例子.给定一个句子和一个目标语法形式(例如,一个选区解析),s ...

  7. [转帖]服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue

    服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue https://ywnz.com/linuxyffq/5270.html 改天试用一下. ...

  8. 「java.util.concurrent并发包」之 ReentrantReadWriteLock

    一 引言 在多线程的环境下,对同一份数据进行读写,会涉及到线程安全的问题.比如在一个线程读取数据的时候,另外一个线程在写数据,而导致前后数据的不一致性:一个线程在写数据的时候,另一个线程也在写,同样也 ...

  9. PAT B1036 跟奥巴马一起编程 (15)

    AC代码 #include <cstdio> using namespace std; int main(){ int n = 0, m = 0; char a; scanf(" ...

  10. T100——q查询,子母查询(汇总——明细)练习笔记

    范例: 代码: #add-point:input段落 name="ui_dialog.input" INPUT BY NAME g_master.bdate,g_master.ed ...