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

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} );

  u) 统计: db.user.find().count();

 

五、索引

  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的用处不大)

 

posted on 2021-02-05 14:30  鸥海  阅读(93)  评论(0编辑  收藏  举报