zoukankan      html  css  js  c++  java
  • mongodb基础学习

    Mongdb

    mongdb入门

    mongdb安装

    linux下安装mangdb

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.10.tgz
    
    • 下载完成后解压
    tar zxvf mongodb-linux-x86_64-rhel62-3.2.10.tgz
    
    • 安装成功 安装成功后的文件结构目录如下:
    bin 
    	mongo.exe
    	mongo.pdb
    	mongod.exe
    	mongod.pdb
    	mongodump.exe
    	mongoexport.exe
    	mongofiles.exe
    	mongoimport.exe
    	mongooplog.exe
    	mongoperf.exe
    	mongoperf.pdb
    	mongorestore.exe
    	mongos.exe
    	mongos.pdb
    	mongostat.exe
    	mongotop.exe
    GNU-AGPL-3.0
    README
    THIRD-PARTY-NOTICES
    

    bin文件夹下是mongodb的各种工具组件,具体功能请查看mongodb手册

    mongdb安装

    • 进入/usr/local/mongod 默认端口为27017
    ./mongod --path=/data/db
    

    image-20210423084927453

    • 浏览器访问

    image-20210423084801663

    mongodb常用启动参数

    mongod.exe常用参数如下

    参数 描述
    --bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
    --logpath 定MongoDB日志文件,注意是指定文件不是目录
    --logappend 使用追加的方式写日志
    --dbpath 指定数据库路径
    --port 指定服务端口号,默认端口27017
    --serviceName 指定服务名称
    --serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
    --install 指定作为一个Windows服务安装。

    mongod.exe的启动参数,在window环境下和linux环境下并不相同,详见mongod - mongodb启动服务工具

    mongodb后台启动

    • 配置环境变量 export PATH=$PATH:/usr/local/mongodb-3.2.10/bin
    • 编写mongodb配置文件
    #数据库路径
    dbpath=/data/db/
    #日志输出文件路径
    logpath=/data/log/mongod.log
    #错误日志采用追加模式
    logappend=true
    #启用日志文件,默认启用
    journal=true
    #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    quiet=true
    #端口号 默认为27017
    port=27017
    
    • vim /etc/init.d/mongdb
    #!/bin/sh  
    # chkconfig: 2345 10 90 
    # description: myservice ....
    #  
    #  ### BEGIN INIT INFO 
    # Short-Description: mongodb    
    # Description: mongo db server    
    ### END INIT INFO    
    
    #注意这里的路径设置为你的mongod的位置
    PROGRAM=/usr/local/mongodb-3.2.10/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"
    #注意这里的路径设置为你的mongodb的配置文件的位置
         $PROGRAM --fork --quiet -f /data/conf/mongod.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
    
    • 然后启动mongdb service mongodb start

    启动shell

    • 使用mongodb自带的shell

    image-20210423093125956

    mongodb数据增删

    在mongodb中是通过数据库、集合、文档的方式来管理数据,下边是mongodb与关系数据库的一些概念对比:

    image-20210423094347647

    创建数据库

    • 创建数据库
    use DATABASE_NAME
    

    如果数据库不存在,则创建数据库,否则切换到指定数据库。

    image-20210423093335432

    • 查看所有数据库
    show dbs
    

    image-20210423093421141

    可以看到我们刚刚创建的数据库并不在列表中 如果想要添加进去必须插入一些数据

    db.mongodb_test.insert({'name':'zgrey'})
    

    image-20210423093739942

    • 再次查看

    image-20210423093823484

    MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

    删除数据库

    • 删除数据库
    db.dropDatabase()
    

    删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。

    • 首先查看所有数据库

    image-20210423094014130

    • 进入数据库

    image-20210423094133546

    • 删除数据库 db.dropDatabase()

    image-20210423094212571

    • 再次查看数据库

    image-20210423094301502

    • 集合删除的格式是 db.collection.drop()

    集合增删

    • 创建集合
    db.createCollection(name, options)
    name: 新创建的集合名称
    options: 创建参数
    
    • 删除集合
    db.collection.drop()
    例子:
    db.student.drop() 删除student集合
    

    Mongodb插入文档

    1. 文档的数据结构和JSON基本一样。

    2. 所有存储在集合中的数据都是BSON格式。

    3. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。

    • MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
    db.COLLECTION_NAME.insert(document)  
    
    • 以下文档可以存储在 MongoDB 的 mongo 数据库 的 col集合中:
    db.col.insert({title:'Mongodb_test',description:'Mongodb是一个Nosql数据库',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
    

    以上实例中 col 是我们的集合名,前一章节我们已经创建过了,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

    • 查看数据库 db.col.find()

    image-20210423095248561

    • 我们也可以将数据定义为一个变量,如下所示:
    document=({title:'Mongodb_test',description:'Mongodb是一个Nosql数据库',by:'zgrey',url:'www.zgrey.com',tags:['mongodb','test','zgrey'],likes:100})
    

    image-20210423095528623

    • 插入数据库 db.col.insert(document)

    image-20210423095600116

    插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

    Mongodb删除文档

    MongoDB remove()函数是用来移除集合中的数据。

    MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

    • 删除文档的基本语法
    db.collection.remove( 
    	<query>,     
    	<justOne> 
    )  
    

    如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

    db.collection.remove(     
    	<query>,     
    	{       
    		justOne: <boolean>,
    		writeConcern: <document> 
    	} 
    )
    

    参数说明:

    • query :(可选)删除的文档的条件。
    • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
    • writeConcern :(可选)抛出异常的级别。

    使用find()函数查询数据

    image-20210423100304965

    • 接下来我们移除 title 为 'Mongodb_test' 的文档:
    db.col.remove({'title':'Mongodb_test'})
    

    image-20210423100442066

    移除两条数据

    • 再次查看集合

    image-20210423100522813

    如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

    • 再次插入两条新的数据

    image-20210423100650434

    • 测试上面的命令 db.col.remove({title:'Mongodb_test'},1)

    image-20210423100740495

    image-20210423100822650

    • 如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
    >db.col.remove({})  
    >db.col.find()  
    

    更新文档

    MongoDB 使用 update()save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。

    • update() 方法用于更新已存在的文档。语法格式如下:
    db.collection.update(    
    	<query>, 
    	<update>, 
    	{       
    		upsert: <boolean>,   
    		multi: <boolean>,  
    		writeConcern: <document>
    	}
    )
    

    参数说明:

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

    我们在集合 col 中插入如下数据:

    image-20210423101253766

    • 接着我们通过 update() 方法来更新标题(title):
    db.col.update({'title':'Mongodb_test'},{$set:{'title':'Mongodb'}})
    

    image-20210423101450790

    image-20210423101916732

    以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

    >db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB'}},{multi:true})
    
    • save方法

    save() 方法通过传入的文档来替换已有文档。语法格式如下:

    db.collection.save(    
    	<document>,     
    	{      
    		writeConcern: <document> 
    	}  
    )  
    

    参数说明:

    • document : 文档数据。
    • writeConcern :可选,抛出异常的级别。

    测试: 这里我们替换id为 ObjectId("60822d2002162bf438740c6e")的文档

    db.col.save({"_id" : ObjectId("60822d2002162bf438740c6e"),'title':'Mongodb','description':'Mongodb Nosql','by':'zgrey','url':'www.zgrey',"tags" : [ "mongodb", "test", "zgrey" ], "likes" :123})
    

    image-20210423102407273

    • 更多实例

    只更新第一条记录:

    db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
    

    全部更新:

    db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
    

    只添加第一条:

    db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
    

    全部添加加进去:

    db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
    

    全部更新:

    db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
    

    只更新第一条记录:

    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
    

    用户操作

    创建用户

    创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误。

    db.createUser(user, writeConcern)
    
    • user:这个文档创建关于用户的身份认证和访问信息;
    • writeConcern:这个文档描述保证MongoDB提供写操作的成功报告。

    User文档

    user文档,定义了用户的以下形式:

    { user: "<name>",
      pwd: "<cleartext password>",
      customData: { <any information> },
      roles: [
        { role: "<role>", db: "<database>" } | "<role>",
        ...
      ]
    }
    

    user文档字段介绍:

    • user字段,为新用户的名字;
    • pwd字段,用户的密码;
    • cusomData字段,为任意内容,例如可以为用户全名介绍;
    • roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;

    在roles字段,可以指定内置角色和用户定义的角色。

    MongoDB内置角色有如下:

    1. 数据库用户角色:read、readWrite;

    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;

    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

    4. 备份恢复角色:backup、restore;

    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

    6. 超级用户角色:root

      // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

    7. 内部角色:__system

    你可以点击这里查看每个角色所拥有的操作权限。

    writeConcern文档

    • w选项:允许的值分别是 1、0、大于1的值、"majority"、
    • j选项:确保mongod实例写数据到磁盘上的journal(日志),这可以确保mongd以外关闭不会丢失数据。设置true启用。
    • wtimeout:指定一个时间限制,以毫秒为单位。wtimeout只适用于w值大于1。

    示例

    例如:在products数据库创建用户accountAdmin01,并给该用户admin数据库上clusterAdmin和readAnyDatabase的角色,products数据库上readWrite角色。

    use products
    db.createUser( { "user" : "zgrey",
                     "pwd": "123",
                     "customData" : { employeeId: 12345 },
                     "roles" : [ { role: "clusterAdmin", db: "admin" },
                                 { role: "readAnyDatabase", db: "admin" },
                                 "readWrite"
                                 ] },
                   { w: "majority" , wtimeout: 5000 } )
    
    image-20210423105132610
    • 测试 mongo -u zgrey -p 123 --authenticationDatabase products

    image-20210423105229143

    查询用户

    show users

    image-20210423105540423

    删除用户

    • 格式 db.dropUser("用户名")

    image-20210423105652353

    修改用户

    • 格式

    image-20210423105904820

    • 先创建一个用户 在products数据库下
    use products
    db.createUser( { "user" : "zgrey",
                     "pwd": "123",
                     "customData" : { employeeId: 12345 },
                     "roles" : [ { role: "clusterAdmin", db: "admin" },
                                 { role: "readAnyDatabase", db: "admin" },
                                 "readWrite"
                                 ] },
                   { w: "majority" , wtimeout: 5000 } )
    
    • 修改用户的角色 db.updateUser('zgrey',{'roles':[{'role':'clusterAdmin','db':'admin'}]})

    image-20210423111330887

    修改密码

    • 修改zgrey用户密码为789 db.changeUserPassword('zgrey','789')
    • 测试 mongo -uzgrey -p789 --authenticationDatabase products

    image-20210423111650550

    java代码连接mongodb

    		<dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongo-java-driver</artifactId>
                <version>3.2.1</version>
            </dependency>
    
    • 编写测试类
    	@Test
        public void connect(){
            MongoClient mongoClient = new MongoClient("192.168.207.139",27017);
            //也可以使用字符串进行连接
    //        MongoClientURI clientURI = new MongoClientURI("mongodb://192.168.207.139:27017");
    //        MongoClient mongoClient = new MongoClient(clientURI);
            MongoDatabase products = mongoClient.getDatabase("mongodb");
            MongoCollection<Document> col = products.getCollection("col");
            Document first = col.find().first();
            String s = first.toJson();
            System.out.println(s);
        }
    
  • 相关阅读:
    用php实现一个双向队列 如何实现?
    extract函数行结果
    替换指定字符串中,键对应的键值
    php裁剪图片(支持定点裁剪)
    Swoole和Swoft的那些事 (Http/Rpc服务篇)
    FineCMS介绍
    打造属于自己的比特币钱包
    数据可视化的艺术
    如何通过织云 Lite 愉快地玩转 TSW
    你想知道的大数据知识都在这里
  • 原文地址:https://www.cnblogs.com/zgrey/p/14693675.html
Copyright © 2011-2022 走看看