2016-08-12 mongoDB

数据库排行

1. oracle
    关系数据库管理系统
2. mysql
    关系数据库管理系统
3. microsoft Sql Server
    关系数据库管理系统
4. MongoDB 
    非关系数据库管理系统(文档形式存储)
5. PostgreSQL 
    关系数据库管理系统
6. DB2 
    关系数据库管理系统
7. Cassandra 
    是一套开源分布式NoSQL数据库系统,非关系数据库管理系统
8. Microsoft Access 
    关系数据库管理系统
9. SQLite 
    关系数据库管理系统
10. Redis 
    非关系数据库管理系统(键值对形式存储)

mongoDB 非关系型数据库

介绍

MongoDB是一个基于分布式文件存储的数据库。

由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,
是非关系数据库当中功能最丰富,最像关系数据库的。
他支持的数据结构非常松散,是类似json的bson格式,
因此可以存储比较复杂的数据类型。
Mongo最大的特点是他支持的查询语言非常强大,
其语法有点类似于面向对象的查询语言,
几乎可以实现类似关系数据库单表查询的绝大部分功能,
而且还支持对数据建立索引。

mongodb是文档数据库,存储的是文档(Bson->json的二进制化)。

安装

  1. 下载安装包

    例如:mongodb-linux-x86_64-ubuntu1604-3.2.8.tgz

  2. 安装

进入解压的好的目录 cd mongodb-linux-x86_64-ubuntu1604-3.2.8/。不用编译安装的,本身就是编译后的二进制可执行文件。
移动文件mv mongodb-linux-x86_64-ubuntu1604-3.2.8 /usr/local/mongodb。
cd /usr/local/mongodb/bin 目录下,可以看到这些文件
bsondump*     导出bson结构
mongo*        客户端(相当于mysql.exe)
mongod*       服务端(相当于mysqld.exe)
mongodump*    整体数据库导出(二进制,相当于mysql中的mysqldump)
mongoexport*  导出易识别的json文档或csv文档
mongofiles*   GridFS工具,内建的分布式文件系统
mongoimport*  数据导入程序
mongooplog*   存储Replication的日志文件
mongoperf*    用来测试io性能,可以用来做mongo的io压力测试,和sql server的SQLIOSim
mongorestore* 数据库整体导入
mongos*       路由器(分片时用)数据分片程序,支持数据的横向扩展
mongosniff*   提供了对数据库实时活动的低级别操作跟踪和嗅探视图。专为MongoDB定制的,类似于tcpdump用于TCP/IP网络流量分析。mongosniff常用于驱动开发。
mongostat*    监视程序
mongotop*     用来跟踪MongoDB的实例, 提供每个集合的统计数据。默认情况下,mongotop每一秒刷新一次 
  1. 启动MongoDB
新建数据库的存放的位置目录 如 mkdir /usr/local/mongodb/data
新建日志的存放位置目录 如 mkdir /usr/local/mongodb/logs
启动mongodb  如 ./bin/mongod --dbpath /usr/local/mongodb/data/ --logpath /usr/local/mongodb/logs/mongodb.log --fork --port 27017

参数说明
--dbpath 数据存储目录
--logpath 日志存储目录
--port 运行端口(默认27017)
--fork 后台进程运行

提示child process started successfully, parent exiting,说明服务启动成功。可以使用ps aux | grep mongo 看到mongodb进程。

客户端连接:./bin/mongo
提示MongoDB shell version: 3.2.8
connecting to: test
连接成功  

mongDB 基本命令语法

输入help可以看到基本操作命令:

show dbs:显示数据库列表 
show collections:显示当前数据库中的集合(类似关系数据库中的表) 
show users:显示用户
use <db name>:切换当前数据库,这和MS-SQL里面的意思一样 
db.help():显示数据库操作命令,里面有很多的命令 
db.foo.help():显示集合操作命令,同样有很多的命令,
              foo指的是当前数据库下,一个叫foo的集合,
              并非真正意义上的命令 
db.foo.find():对于当前数据库中的foo集合进行数据查找
            (由于没有条件,会列出所有数据) 
db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,
            条件是数据中有一个属性叫a,且a的值为1
MongoDB没有创建数据库的命令,但有类似的命令。 

如:如果你想创建一个“myTest”的数据库,先运行use myTest命令,
之后就做一些操作(如:db.createCollection('user')),
这样就可以创建一个名叫“myTest”的数据库。  

数据库常用命令

  1. Help查看命令提示

help

db.help();

db.yourColl.help();

db.youColl.find().help();

rs.help();

  1. 切换/创建数据库

    use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库

  2. 查询所有数据库

    show dbs;

  3. 删除当前使用数据库

    db.dropDatabase();

  4. 从指定主机上克隆数据库

    db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库

  5. 从指定的机器上复制指定数据库数据到某个数据库

    db.copyDatabase("mydb", "temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中

  6. 修复当前数据库

    db.repairDatabase();

  7. 查看当前使用的数据库

    db.getName();

    db; db和getName方法是一样的效果,都可以查询当前使用的数据库

  8. 显示当前db状态

    db.stats();

  9. 当前db版本

db.version();

  1. 查看当前db的链接机器地址

db.getMongo();


Collection聚集集合

  1. 创建一个聚集集合(table)

    db.createCollection(“collName”, {size: 20, capped: 5, max: 100});

  2. 得到指定名称的聚集集合(table)

    db.getCollection("account");

  3. 得到当前db的所有聚集集合

    db.getCollectionNames();

  4. 显示当前db所有聚集索引的状态

    db.printCollectionStats();


用户相关

  1. 添加一个用户

    db.addUser("name");

    db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读

  2. 数据库认证、安全模式

    db.auth("userName", "123123");

  3. 显示当前所有用户

    show users;

  4. 删除用户

    db.removeUser("userName");


其他

  1. 查询之前的错误信息
    db.getPrevError();
  2. 清除错误记录
    db.resetError();
  3. 查看聚集集合基本信息
1. 查看帮助  db.yourColl.help();
2. 查询当前集合的数据条数  db.yourColl.count();
3. 查看数据空间大小 db.userInfo.dataSize();
4. 得到当前聚集集合所在的db db.userInfo.getDB();
5. 得到当前聚集的状态 db.userInfo.stats();
6. 得到聚集集合总大小 db.userInfo.totalSize();
7. 聚集集合储存空间大小 db.userInfo.storageSize();
8. Shard版本信息  db.userInfo.getShardVersion()
9. 聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users
10. 删除当前聚集集合 db.userInfo.drop();

聚集集合查询

  1. 查询所有记录
    db.userInfo.find();
    相当于:select* from userInfo;
    默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
    但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。

  2. 查询去掉后的当前聚集集合中的某列的重复数据
    db.userInfo.distinct("name");
    会过滤掉name中的相同数据
    相当于:select distict name from userInfo;

  3. 查询age = 22的记录
    db.userInfo.find({"age": 22});
    相当于: select * from userInfo where age = 22;

  4. 查询age > 22的记录
    db.userInfo.find({age: {$gt: 22}});
    相当于:select * from userInfo where age >22;

  5. 查询age < 22的记录
    db.userInfo.find({age: {$lt: 22}});
    相当于:select * from userInfo where age <22;

  6. 查询age >= 25的记录
    db.userInfo.find({age: {$gte: 25}});
    相当于:select * from userInfo where age >= 25;

  7. 查询age <= 25的记录
    db.userInfo.find({age: {$lte: 25}});

  8. 查询age >= 23 并且 age <= 26
    db.userInfo.find({age: {$gte: 23, $lte: 26}});

  9. 查询name中包含 mongo的数据
    db.userInfo.find({name: /mongo/});
    //相当于%%
    select * from userInfo where name like ‘%mongo%’;

  10. 查询name中以mongo开头的
    db.userInfo.find({name: /^mongo/});
    select * from userInfo where name like ‘mongo%’;

  11. 查询指定列name、age数据
    db.userInfo.find({}, {name: 1, age: 1});
    相当于:select name, age from userInfo;
    当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。

  12. 查询指定列name、age数据, age > 25
    db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
    相当于:select name, age from userInfo where age >25;

  13. 按照年龄排序
    升序:db.userInfo.find().sort({age: 1});
    降序:db.userInfo.find().sort({age: -1});

  14. 查询name = zhangsan, age = 22的数据
    db.userInfo.find({name: 'zhangsan', age: 22});
    相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;

  15. 查询前5条数据
    db.userInfo.find().limit(5);
    相当于:selecttop 5 * from userInfo;

  16. 查询10条以后的数据
    db.userInfo.find().skip(10);
    相当于:select * from userInfo where id not in (
    selecttop 10 * from userInfo
    );

  17. 查询在5-10之间的数据
    db.userInfo.find().limit(10).skip(5);
    可用于分页,limit是pageSize,skip是第几页*pageSize

  18. or与 查询
    db.userInfo.find({$or: [{age: 22}, {age: 25}]});
    相当于:select * from userInfo where age = 22 or age = 25;

  19. 查询第一条数据
    db.userInfo.findOne();
    相当于:selecttop 1 * from userInfo;
    db.userInfo.find().limit(1);

  20. 查询某个结果集的记录条数
    db.userInfo.find({age: {$gte: 25}}).count();
    相当于:select count(*) from userInfo where age >= 20;

  21. 按照某列进行排序
    db.userInfo.find({sex: {$exists: true}}).count();
    相当于:select count(sex) from userInfo;


索引

  1. 创建索引
    db.userInfo.ensureIndex({name: 1});
    db.userInfo.ensureIndex({name: 1, ts: -1});

  2. 查询当前聚集集合所有索引
    db.userInfo.getIndexes();

  3. 查看总索引记录大小
    db.userInfo.totalIndexSize();

  4. 读取当前集合的所有index信息
    db.users.reIndex();

5、删除指定索引
db.users.dropIndex("name_1");

  1. 删除所有索引索引
    db.users.dropIndexes();

修改、添加、删除集合数据

  1. 添加

db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的数据的数据列,没有固定,根据添加的数据为准

  1. 修改

    db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
    相当于:update users set name = ‘changeName’ where age = 25;

    db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
    相当于:update users set age = age + 50 where name = ‘Lisi’;

    db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
    相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;

  2. 删除

    db.users.remove({age: 132});

  3. 查询修改删除

    db.users.findAndModify({

    query: {age: {$gte: 25}},

    sort: {age: -1},

    update: {$set: {name: 'a2'}, $inc: {age: 2}},

    remove: true

    });

    db.runCommand({

    findandmodify : "users", 
    

    query: {age: {$gte: 25}},

    sort: {age: -1},

    update: {$set: {name: 'a2'}, $inc: {age: 2}},

    remove: true

    });

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 一、数据库常用命令1、Help查看命令提示 复制代码 代码如下: helpdb.help();db.yourCol...
    字伯约阅读 352评论 0 0
  • 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。输入help可以看到基本...
    精气神贯通阅读 444评论 0 0
  • 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。 输入help可以看到基...
    你本来就很牛阅读 28,353评论 0 3
  • MongoDB指令 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collect...
    东海虬髯客阅读 227评论 0 3
  • 最近在学习MongoDB,整理梳理一下各种命令,怕以后忘记,以后可以自己查阅! 常用的方法: 示例: 文件导出至J...
    Kalvin_Tse阅读 734评论 3 3