zoukankan      html  css  js  c++  java
  • mongodb教程

      

     

    一、特点介绍(占用磁盘空间大):

    mongodb是文档型数据库,存储的是文档(Bson->json的二进制化),特点:内部执行引擎为js解释器,把文档存储成bson结构,查询时转换为js对象

    并通过熟悉的js语法来操作。

    二、mongodb的下载安装

      a) 下载地址:https://www.mongodb.com/try/download/community

      b) 下载: wget https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.2.8.tgz

      c) 解压: tar -zxvf  mongodb-macos-x86_64-4.2.8.tgz

      d) 移动:mv mongodb-macos-x86_64-4.2.8 /usr/local/mongodb

      e) 切换到程序目录: cd /usr/local/mongodb

      f) 建立目录:mkdir -p ./database  ./log

      g) 启动服务:sudo ./bin/mongod --dbpath ./database/ --logpath ./log/default.log --fork --port 27017

        参数解释:

          --dbpath:数据库存储目录

          --logpath:日志存储目录

          --port:运行端口(默认 27017

          --fork:后台进程运行

      h) 连接mongo客户端: ./bin/mongo

    三、mongo库表操作语句(user为表名)

      a) 查看所有数据库:show dbs; show databases;

      b) 选库(或创建库):use databaseName;

      c) 查看表:show tables; show collections;

      d) 查看操作命令:db.help();

      e) 创建表:db.createCollection('user');

      f) 新增一行:db.user.insert({name:'test',age:22});

      g) 新增多行:db.user.insert( [{name:'test',age:22},{name:'xiali',age:2}] );

      h) ID查表数据:db.user.find(‘id’);

      i) 删除表:db.user.drop();

      j) 删除数据库:db.dropDatabase();

      k) 删除数据:db.user.remove(查询表达式,选项);

      l) 替换文档:db.user.update({name:'tset'},{name:'daming'});

      m) 更新:db.user.update({name:'test'},{$set:{name:'aliang'}},{multi:true});

        i. $set:修改某列的值

        ii. $unset:删除某一列

        iii. $reset:重命名某一列

        iv. $incr:自增某列的值

        v. 选项{multi:true}可作用于多行,默认一行

        vi. 选项{upsert:true}如果查询存在则更新,否则新增

        vii. $setOnInsert:当upsert的时候,补充新增字段

      n) 查表数据:db.user.find(查询表达式,查询列);

      o) 关闭服务器:db.shutdownServer();

    四、查询表达式

      a) $ne不等于:db.user.find( {name:{$ne:'test'}} );

      b) $gt 大于:db.user.find( {age:{$gt:1}} );

      c) $lt 小于:db.user.find( {age:{$lt:1}} );

      d) $gte 大于等于:db.user.find( {age:{$gte:1}} );

      e) $lte 小于等于:db.user.find( {age:{$lte:1}} );

      f) $nin 不在范围内:db.user.find( {age:{$nin:[1,9]}} );

      g) $in 在范围内:db.user.find( {age:{$in:[1,9]}} )

      h) $all 匹配所有:db.user.find( {age:{$all:[2,22]}} );

      i) $ordb.user.find( {$or:[{name:{$ne:'test'}},{age:{$gt:5}}]} );

      j) $anddb.user.find( {$and:[{name:{$ne:'test'}},{age:{$gt:5}}]} );

      k) $not 取反:db.user.find( {age:{$not:{$gt:1}}} );

      l) $nor 都不成功则为真:db.user.find({$nor:[{name:'test'},{age:{$gt:30}}]});

      m) $exists 某列存在则为真:db.user.find( {age:{$exists:true}} );

      n) $mod满足求余条件则为真:db.user.find( {age:{$mod:[3,2]}} ); //32

      o) $type数据为某类型则为真:db.user.find( {age:{$type:'number'}} );

      p) $where 条件查询:db.user.find( {$where: 'this.age>2 && this.name == "test"' } );  //不建议使用,须把二进制数据转成js对象格式再查询,效率低

      q) $regex 正则:db.user.find( {name:{$regex:/test/}} );  // 不建议使用,效率低

      r) 查询遍历:db.user.find().forEach( function(obj){printjson(obj)} );

      s) 分页查询:db.user.find().skip(2).limit(3);

      t) 排序:db.user.find().sort( {name:1,age:-1} );

    五、索引

      a) 查看查询分析:db.user.find().explain();

      b) 查看当前索引:db.user.getIndexes();

      c) 创建单列索引:db.user.ensureIndex({field:1/-1});  // 1为正序,-1为倒序

      d) 创建多列索引:db.user.ensureIndex({field1:1/-1,field2:1/-1});

      e) 创建子文档索引:db.user.ensureIndex({field.subfield:1/-1});

      f) 创建唯一索引:db.user.ensureIndex({field.subfield:1/-1},{unique:true});

      g) 删除索引:db.user.dropIndex({field:1/-1});

      h) 删除所有索引:db.user.dropIndexes();

    六、用户管理

      a) 切换admin数据库:use admin;

      b) 添加:db.createUser({user:'用户名',pwd:'密码',roles:[{role:'read',db:'admin'}]});

        i. read允许用户读取指定数据库

        ii. readWrite:允许读写数据库

        iii. dbAdmin:允许执行管理函数,如索引创建、删除,查看统计等

        iv. userAdmin:允许创建、删除和管理用户

        v. clusterAdmin:只在admin数据库可用,赋予用户所有分片和复制集中相关函数的管理权限。

        vi. readAnyDatabase:只在admin数据库可用,赋予用户所有数据库的读权限。

        vii. readWriteAnyDatabase:只在admin数据库可用,赋予用户所有数据库读写权限。

        viii. root:只在admin数据库可用,超级账号,超级权限。

      c) 删除:db.dropUser(用户名);

      d) 更新密码:db.changeUserPassword("用户名","新密码")

      e) 更新密码二:db.updateUser("用户名",{"pwd":"新密码"})

      f) 更新角色:db.updateUser('用户名',{roles:[{role:'角色名称',db:'数据库名}]});

      g) 用户验证:db.auth('用户名','密码');

    七、mongodb备份和恢复

      a) 导出:mongoexport -h host -p port -u username -p password

        i. -d database:要导出的数据库

        ii. -c collection:到导出的表

        iii. -f field:要导出的列

        iv. -q:查询条件(用引号包起来)

        v. -o:导出文件名

        vi. --csv:导出csv格式

      b) 导入:mongoImport

        i. -d database:待导入的数据库

        ii. -c collection:待导入的表

        iii. --type:文件类型,默认:csvjson

        iv. --file:备份文件路径

      c) 二进制导出:mongodump

        i. -d database:库名

        ii. -c collectino:表名

        iii. -f fieldsfield1,field2...列名

      d) 二进制导入:mongorestore

        i. -d database:库名

        ii. --directoryperdb 备份目录

    八、replication复制集

      a) 建立复制集目录: mkdir -p ./database0 ./database1 ./database2 ./log

      b) 启动1服务(复制集 repl )sudo ./bin/mongod --dbpath ./database0 --logpath ./log/default0.log --fork --port 27017 --replSet repl --smallfiles

      c) 启动2服务(复制集 repl )sudo ./bin/mongod --dbpath ./database1 --logpath ./log/default1.log --fork --port 27018 --replSet repl --smallfiles

      d) 启动3服务(复制集 repl )sudo ./bin/mongod --dbpath ./database2 --logpath ./log/default2.log --fork --port 27019 --replSet repl --smallfiles

      e) 声明配置变量:

        var rsconf = {

          _id: 'repl',

          members:[

          {

            _id:0,

            host: '127.0.0.1:27017'

          },

          {

            _id:1,

            host: '127.0.0.1:27018'

          },

          {

            _id:2,

            host: '127.0.0.1:27019'

          }]

        }

      f) 根据配置初始化:rs.initiate(rsconf);

      g) 查看状态:rs.status();

      h) 添加节点:rs.add('127.0.0.1:27019');

      i) 删除节点:rs.remove('127.0.0.1:27019');

      j) 允许slave读写:re.slaveok();  // 默认不许读写;

    九、shard分片

    十、聚集运算

      a) 分组统计(不支持shardcluster):db.collection.group({

          key: {key1:1,key2:2},

          cond:{},

          reduce:function(curr,result){

            result.total+= 1;

          },

          initial:{total:0},

          finalize:function(){}

        })

        i. key:分组字段

        ii. cond:查询条件

        iii. reduce:聚合函数(迭代)

        iv. initial:初始化参数值

        v. finalize:统一一组后的回调函数

        vi. curr:检索当前行数据

        vii. result:统计结果

      b) 简单聚合:db.collection.aggregate()

         

       c) 强大统计:db.collection.mapReduce(

          <map>, // 回调映射函数,为迭代函数传参

          <reduce>, // 回调迭代函数,统计运算

          {

              out: <collection>,

              query: <document>,

              sort: <document>,

              limit: <number>,

              finalize: <function>,

              scope: <document>,

              jsMode: <boolean>,

              verbose: <boolean>,

              bypassDocumentValidation: <boolean>

          }

       )

        i. map函数:

          1. 作用:用于分组

          2. 函数:function map(){ emit(param1, param2); }

          3. 参数说明:

           param1:需要分组的字段,this.字段名

           param2:需要进行统计的字段,this.字段名

        ii. reduce函数:

          1. 作用:处理需要统计的字段

          2. 函数:function reduce(key, values){

             // 统计字段处理  return Array.sum(values);

            }

          3. 参数说明:

            key: 指分组字段(emitparam1)对应的值

            values:指需要统计的字段(emitparam2)值组成的数组

        iii. option部分:

          1. out:将统计结果存放到集合中 (不指定则使用临时集合,在客户端断开后自动删除)

          2. query:一个筛选条件,只有满足条件的文档才会调用map函数(querylimitsort可以随意组合)

          3. sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制

          4. limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)

  • 相关阅读:
    drf序列化组件之视图家族
    drf请求模块分析
    初识web API接口及Restful接口规范
    Vue与Django前后台分离跨域配置
    vue使用一些外部插件及样式的配置
    Linux(Ubuntu)下面SecureCRT 完全破解
    EDS 14.0 dtc:commmand not found
    sopcinfo路径改变,nios工程该怎么办?
    软件实现的施密特触发器
    一定要上的网站
  • 原文地址:https://www.cnblogs.com/zgxblog/p/13255496.html
Copyright © 2011-2022 走看看