mongodb的使用

本文详细介绍了MongoDB的安装步骤,包括下载、解压、配置、设置权限等,并提到了在SecureCRT中遇到的问题。同时,讨论了MongoDB作为分布式文件存储数据库的特点和查询语言的强大。此外,文章还讲述了如何在SpringBoot应用中整合MongoDB,通过pom.xml和application.yml配置,并展示了MongoTemplate的使用,实现了级联操作。
摘要由CSDN通过智能技术生成

简介:是一个用c++语言编写的一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

1. 安装步骤

一、下载相应版本的MongoDB tgz包
二、使用ftp上传tgz包到/usr/local/src/MongoDB路径下
三、解压tgz包,将解压后的文件夹重命名为mongodbserver
四、进入mongodbserver文件夹,创建db、log、etc文件夹
五、进入mongodbserver/etc文件夹下创建mongodb.conf,并设置以下参数

vim mongodb.conf

dbpath=/usr/local/src/MongoDB/mongodbserver/db                #数据库存放的位置
logpath=/usr/local/src/MongoDB/mongodbserver/log/mongodb.log  #日志存放的位置
port=27017                                                    #端口号
fork=true                                                     #是否以后台进程启动 	
journal=false                                                 #启用日志文件
storageEngine=mmapv1
nohttpinterface=true                                          #是否支持http访问 
#auth=true                                                    #是否以安全认证方式运行,默认是不认证的非安全方式

六、启动mongodb

进入 /usr/local/src/MongoDB/mongodbserver/bin文件夹下
输入命令:./mongod --config /usr/local/src/MongoDB/mongodbserver/etc/mongodb.conf

七、防火墙打开27017端口

/sbin/iptables -I INPUT -p tcp --dport 27017 -j ACCEPT
/etc/rc.d/init.d/iptables save

在浏览器中输入:http://192.168.22.130:27017 进行访问

八、设置用户名和密码

1、输入./mongo  进入mongo命令行(进入bin文件夹)
2、选择admin数据库: >use admin
3、创建用户并授予权限:>db.createUser({user: "root",pwd: "123456",roles: [{ role: "userAdminAnyDatabase", db:"admin" }]});

注:
  如果设置了用户名密码 但是无法操作增删查改 
  报错:
2019-04-29T19:09:25.965+0800 E QUERY    Error: listCollections failed: {
    	"ok" : 0,
    	"errmsg" : "not authorized on admin to execute command { listCollections: 1.0 }",
   	 	"code" : 13
}
	at Error (<anonymous>)
	at DB._getCollectionInfosCommand (src/mongo/shell/db.js:646:15)
	at DB.getCollectionInfos (src/mongo/shell/db.js:658:20)
	at DB.getCollectionNames (src/mongo/shell/db.js:669:17)
	at shellHelper.show (src/mongo/shell/utils.js:625:12)
	at shellHelper (src/mongo/shell/utils.js:524:36)
	at (shellhelp2):1:1 at src/mongo/shell/db.js:646

解决方式  更该用户的权限 
	经过查询错误解决办法,了解到是集群管理权限不够,添加相应权限之后就可以解决问题,变更用户权限如下
	db.updateUser(
		"root",
    			{
        				roles : 
        				[
              				{"role" : "userAdminAnyDatabase","db" : "admin"},
              				{"role" : "dbOwner","db" : "admin"},
              				{"role" : "clusterAdmin", "db": "admin"}
         				]
    			}
	)   

4、使用>show users或>db.system.users.find()查看已有用户
5、添加完管理用户后,关闭MongoDB,并使用权限方式再次开启MongoDB,这里注意不要使用kill直接去杀掉mongodb进程,
  (如果这样做了,请去data/db目录下删除mongo.lock文件),可以使用db.shutdownServer()关闭.
   退出
6、使用权限方式启动MongoDB
   mongodb.conf在配置文件中添加:auth=true , 然后启动。

7、输入./mongo命令,进入mongo shell,使用admin数据库并进行验证,如果不验证,是做不了任何操作的。
    ./mongo
    >use admin
    >db.auth("pfnieadmin","123456")   #认证,返回1表示成功



注:关闭mongodb的方式
    1、mongo命令行,使用	关闭
    2、进入bin文件夹下 使用./mongod -shutdown ./mongod -shutdown -dbpath=/usr/local/src/MongoDB/mongodbserver/db
    3、killall mongod 杀死进程(不推荐使用)

    查看mongodb是否启动:lsof -i :端口 如:lsof -i :27017

九、将mongod路径添加到系统路径中,方便随处执行mongod命令(设置环境变量)

 1、编辑/etc/profile文件,添加export PATH=$PATH:/usr/local/src/MongoDB/mongodbserver/bin
    vim /etc/profile

 2、执行source /etc/profile,使系统环境变量立即生效 

十、将mongo路径软链到/usr/bin路径下,方便随处执行mongo命令

执行命令: ln -s /usr/local/src/MongoDB/mongodbserver/bin/mongo  /usr/bin/mongo

十一、测试是否方便随处执行mongo命令
cd /
输入 “mongo” 命令,进入mongo shell,进行测试

十二、MongoDB设置为系统服务并且设置开机启动

1、首先添加MongoDB系统服务,命令如下:

  vim /etc/rc.d/init.d/mongod

2、打开编辑器后,我们将下面的配置粘贴进去,然后保存(注意:mongodb.conf文件的路径)

 start() {  
	/usr/local/src/MongoDB/mongodbserver/bin/mongod  --config /usr/local/src/MongoDB/mongodbserver/etc/mongodb.conf 
}  

stop() {  
	/usr/local/src/MongoDB/mongodbserver/bin/mongod --config /usr/local/src/MongoDB/mongodbserver/etc/mongodb.conf --shutdown  
}  
case "$1" in  
     start)  
  start  
  ;;  

         stop)  
      stop  
      ;;  

         restart)  
      stop  
      start  
      ;;  
     *)  
    echo  
$"Usage: $0 {start|stop|restart}"  
	exit 1  
esac 

3、保存完成之后,添加脚本执行权限,命令如下:

chmod +x /etc/rc.d/init.d/mongod
4、启动MongoDB:
  service mongod start
   关闭MongoDB:
   service mongod stop

2. 常用命令

show dbs;                  #查看全部数据库
show collections;        #显示当前数据库中的集合(类似关系数据库中的表)
show users;               #查看当前数据库的用户信息
use dbname;               #如果dbname不存在 则创建该数据库 如果存在则转到该数据库下
db;或者db.getName();      #查看当前所在数据库
db.dropDatabase();         #删除数据库
db.stats();                 #显示当前db状态
db.createCollection("集合名称");   #创建集合
db.集合名称.drop();   #删除集合

#查询
db.集合名称.find(); #查询所有 
db.集合名称.find({name:”dome”<,...>});  #条件查询  (name为dome的记录 传入多个键值即会当做and来处理)
#OR语句查询
db.集合名称.find( { $or:[ {age:"18"}, {age:"19"} ] } )
#条件操作符:($gt表示大于、$lt表示小于、$le表示小于等于、$ge表示大于等于、$ne表示不等于)
列:age:{$gt:30}   #年龄大于30
db.集合名称.find().limit(10)  # 分页查询: 读取集合中前十条数据
#skip读取时跳过指定数量的数据记录,下面代码是读取集合中第6条到第15条记录
db.集合名称.find().limit(10).skip(5)
#sort对查询的结果进行排序,下面代码是读取集合中的数据,并按照age进行升序排序
db.集合名称.find().sort({"age":1})   #(1表示升序   -1表示降序)

#添加
#添加数据(1)
db.集合名称.insert({name:"psz",age:18})  #插入一条数据(未指定_id)
db.集合名称.insert({_id:123,name:"psz2",age:19}) #(指定_id)
#添加数据(2)
user1=({name:"user1",password:"111"})  
db.集合名称.insert(user1)

#_id为数据的唯一标识符 可以用户分配,也可以由MongoDB自动分配,一般采用自动分配。
#如果用户采用自行分配必须确保该_id在数据库中是唯一的 
#向集合中插入数据,insert与save都是向集合汇总插入数据。如果新增的数据中有主键,并且重复,则使用insert会报错,但是save会更改原来的数据。

#修改
db.collection.update( criteria, objNew, upsert, multi )
#criteria : update的查询条件,类似sql update查询内where后面的
#objNew   : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
#upsert   : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
#multi    : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

#更新文档,下面代码是把name为user1的第一条文档更新为{name:”cx”,age:22}
db.集合名称.update({name:"user1"},{name:"cx",age:22})
#如果只是需要设置文档里的指定的一些域的值,则需要加$set关键字,下面代码是把name为user1的第一条文档的age值更更新为22,sex的值更新为”M”
db.集合名称.update({name:"user1"},{$set:{age:22,sex:"M"}})

#删除
db.集合名称.remove({name:"user1"})  #删除集合中name为user1的数据

注意事项:

使用SecureCRT.exe工具,命令输入错误无法删除问题:

在这里插入图片描述

3. SpringBoot整合MongoDB

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

application.yml

spring: 
	data:
    mongodb:
      host: 192.168.1.130  #ip地址
      port: 27017 #端口号(默认27017,在linux系统中需先启动该端口)
      database: admin #数据库名称

代码实现:
在测试类中注入:
@Autowired
private MongoTemplate template;
常用方法:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {

    @Autowired
    MongoTemplate template;

    /**
     * 查询数据
     */
    @Test
    public void contextLoads() {
        //查询全部
        List<ceshiyi> list=template.findAll(ceshiyi.class);
        //使用subList获取指定索引内的数据
        List<ceshiyi> list2=template.findAll(ceshiyi.class).subList(1,3);

        //按条件查询 指定集合的信息
       /* List<ceshiyi> list=null;
        try {
            Query query=new Query(Criteria.where("name").is("虚空行者").and("mc").is("卡萨丁"));
            list=template.find(query, ceshiyi.class,"ceshiyi");
        } catch (Exception e) {
            // TODO: handle exception
        }
        System.out.print("listLength:"+list.size()+"...ListName:"+list.get(0).getMc());*/

    }
    /**
     * 添加数据
     */
    @Test
    public void addinfo(){
/*       BasicDBObject doc = new BasicDBObject();
        doc.put("name","虚空行者");
        doc.put("mc","卡萨丁");*/

        Map<String,String> map=new HashMap<String,String>();
        map.put("name","麦林炮手");
        map.put("mc","崔丝塔娜");
        template.save(map,"ceshiyi");
    }
    /**
     * 修改操作
     */
    @Test
    public void updateinfo(){
        try {
            Query query=new Query(Criteria.where("name").is("虚空行者"));
            Update update= new Update().set("name","齐天大圣").set("mc","孙悟空");
            //更新查询返回结果集的第一条
            template.updateFirst(query,update,ceshiyi.class,"ceshiyi");
            //更新查询返回结果集的所有
            // mongoTemplate.updateMulti(query,update,Student.class);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    /**
     * 删除操作
     */
    @Test
    public void deleteinfo(){
        Query query=new Query(Criteria.where("name").is("麦林炮手"));
        template.remove(query, ceshiyi.class,"ceshiyi");
    }



    private GridFSBucket gridFSBucket;

    /**
     * 向mongodb数据库中添加文件
     */
    @Test
    public void ceshi() {
        gridFSBucket = GridFSBuckets.create(template.getDb(),"wenjian");
        //文件路径
        String url="D:/linshixiangmu/mongodbtest.txt";
        InputStream ins = null;
        ObjectId fileid = null;
        // 配置一些参数
        GridFSUploadOptions options = null;
        // 截取文件名
        String filename = url.substring((url.lastIndexOf("/") + 1), url.length());
        try {
            ins = new FileInputStream(new File(url));
            options = new GridFSUploadOptions().chunkSizeBytes(358400).metadata(new Document("type", "presentation"));

            // 存储文件,第一个参数是文件名称,第二个是输入流,第三个是参数设置
            fileid = gridFSBucket.uploadFromStream(filename, ins, options);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                ins.close();
            } catch (IOException e) {
            }
        }
        System.out.print(fileid);
    }

    /**
     * 从mongodb中读取文件
     */
    @Test
    public void downFile() {
        gridFSBucket = GridFSBuckets.create(template.getDb(),"wenjian");
        String url="D:/linshixiangmu/duqutest.txt";
        ObjectId id=new ObjectId("5b344b896d66ac23ac290ba3");
        FileOutputStream out = null;
        String result=null;
                try {
            out = new FileOutputStream(new File(url));
            gridFSBucket.downloadToStream(id, out);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                out.close();
                result=out.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.print(result);
    }

    /**
     * 根据objectId删除mongodb中的指定文件
     */
    @Test
    public void deletefile(){
        gridFSBucket = GridFSBuckets.create(template.getDb(),"wenjian");
        ObjectId id=new ObjectId("5b34a4606d66ac1d10c7d398");
        gridFSBucket.delete(id);
    }
}

实现级联操作

// 实现级联新增
Query query = Query.query(Criteria.where("cid").is(cid));
Update update = new Update();
update.addToSet("voiceLibrarys", voice);
mongoTemplate.upsert(query, update, MgVoice.class);

//删除 语音 cid  记录的ID  plid 数组中的一个标记
Query query = Query.query(Criteria.where("cid").is(cid));
BasicDBObject s = new BasicDBObject();
s.put("lid", plid);
Update update = new Update();
update.pull("voiceLibrarys", s);
mongoTemplate.updateFirst(query, update, MgVoice.class);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值