mongodb与mysql命令详细对比

摘要:
传统的关系数据库一般由数据库、表和记录组成。MongoDB由数据库、集合和文档对象组成。MongoDB在关系数据库的表中没有列、行和关系的概念,这反映了自由模式的特点。MySQL MongoDB描述mysqldmongod服务器守护程序mysqlmongo客户端工具mysqldumpmongodump逻辑备份工具mysqlmongostore逻辑恢复工具db。repairDatabase()修复数据库mysqldumpmongoexport数据导出工具sourcemongoimport数据导入工具grant*privilegeson*.*到

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MySQL

MongoDB

说明

mysqld

mongod

服务器守护进程

mysql

mongo

客户端工具

mysqldump

mongodump

逻辑备份工具

mysql

mongorestore

逻辑恢复工具

 

db.repairDatabase()

修复数据库

mysqldump

mongoexport

数据导出工具

source

mongoimport

数据导入工具

grant * privileges on *.* to …

Db.addUser()

Db.auth()

新建用户并权限

show databases

show dbs

显示库列表

Show tables

Show collections

显示表列表

Show slave status

Rs.status

查询主从状态

Create table users(a int, b int)

db.createCollection("mycoll", {capped:true,

size:100000}) 另:可隐式创建表。

创建表

Create INDEX idxname ON users(name)

db.users.ensureIndex({name:1})

创建索引

Create INDEX idxname ON users(name,ts DESC)

db.users.ensureIndex({name:1,ts:-1})

创建索引

Insert into users values(1, 1)

db.users.insert({a:1, b:1})

插入记录

Select a, b from users

db.users.find({},{a:1, b:1})

查询表

Select * from users

db.users.find()

查询表

Select * from users where age=33

db.users.find({age:33})

条件查询

Select a, b from users where age=33

db.users.find({age:33},{a:1, b:1})

条件查询

select * from users where age<33

db.users.find({'age':{$lt:33}})

条件查询

select * from users where age>33 and age<=40

db.users.find({'age':{$gt:33,$lte:40}})

条件查询

select * from users where a=1 and b='q'

db.users.find({a:1,b:'q'})

条件查询

select * from users where a=1 or b=2

db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )

条件查询

select * from users limit 1

db.users.findOne()

条件查询

select * from users where name like "%Joe%"

db.users.find({name:/Joe/})

模糊查询

select * from users where name like "Joe%"

db.users.find({name:/^Joe/})

模糊查询

select count(1) from users

Db.users.count()

获取表记录数

select count(1) from users where age>30

db.users.find({age: {'$gt': 30}}).count()

获取表记录数

select DISTINCT last_name from users

db.users.distinct('last_name')

去掉重复值

select * from users ORDER BY name

db.users.find().sort({name:-1})

排序

select * from users ORDER BY name DESC

db.users.find().sort({name:-1})

排序

EXPLAIN select * from users where z=3

db.users.find({z:3}).explain()

获取存储路径

update users set a=1 where b='q'

db.users.update({b:'q'}, {$set:{a:1}}, false, true)

更新记录

update users set a=a+2 where b='q'

db.users.update({b:'q'}, {$inc:{a:2}}, false, true)

更新记录

delete from users where z="abc"

db.users.remove({z:'abc'})

删除记录

 

db. users.remove()

删除所有的记录

drop database IF EXISTS test;

use test

db.dropDatabase()

删除数据库

drop table IF EXISTS test;

db.mytable.drop()

删除表/collection

 

db.addUser(‘test', 'test')

添加用户

readOnly-->false

 

db.addUser(‘test', 'test', true)

添加用户

readOnly-->true

 

db.addUser("test","test222")

更改密码

 

db.system.users.remove({user:"test"})

或者db.removeUser('test')

删除用户

 

use admin

超级用户

 

db.auth(‘test', ‘test')

用户授权

 

db.system.users.find()

查看用户列表

 

show users

查看所有用户

 

db.printCollectionStats()

查看各collection的状态

 

db.printReplicationInfo()

查看主从复制状态

 

show profile

查看profiling

 

db.copyDatabase('mail_addr','mail_addr_tmp')

拷贝数据库

 

db.users.dataSize()

查看collection数据的大小

 

db. users.totalIndexSize()

查询索引的大小

mongodb语法
MongoDB的好处挺多的,比如多列索引,查询时可以用一些统计函数,支持多条件查询,但是目前多表查询是不支持的,可以想办法通过数据冗余来解决多表查询的问题。
MongoDB对数据的操作很丰富,下面做一些举例说明,内容大部分来自官方文档,另外有部分为自己理解。

查询colls所有数据
db.colls.find() //select * from colls
通过指定条件查询
db.colls.find({‘last_name': ‘Smith'});//select * from colls where last_name='Smith'
指定多条件查询
db.colls.find( { x : 3, y : “foo” } );//select * from colls where x=3 and y='foo'

指定条件范围查询
db.colls.find({j: {$ne: 3}, k: {$gt: 10} });//select * from colls where j!=3 and k>10

查询不包括某内容
db.colls.find({}, {a:0});//查询除a为0外的所有数据

支持<, <=, >, >=查询,需用符号替代分别为$lt,$lte,$gt,$gte
db.colls.find({ “field” : { $gt: value } } );
db.colls.find({ “field” : { $lt: value } } );
db.colls.find({ “field” : { $gte: value } } );
db.colls.find({ “field” : { $lte: value } } );

也可对某一字段做范围查询
db.colls.find({ “field” : { $gt: value1, $lt: value2 } } );

不等于查询用字符$ne
db.colls.find( { x : { $ne : 3 } } );

in查询用字符$in
db.colls.find( { “field” : { $in : array } } );
db.colls.find({j:{$in: [2,4,6]}});

not in查询用字符$nin
db.colls.find({j:{$nin: [2,4,6]}});

取模查询用字符$mod
db.colls.find( { a : { $mod : [ 10 , 1 ] } } )// where a % 10 == 1

$all查询
db.colls.find( { a: { $all: [ 2, 3 ] } } );//指定a满足数组中任意值时

$size查询
db.colls.find( { a : { $size: 1 } } );//对对象的数量查询,此查询查询a的子对象数目为1的记录

$exists查询
db.colls.find( { a : { $exists : true } } ); // 存在a对象的数据
db.colls.find( { a : { $exists : false } } ); // 不存在a对象的数据

$type查询$type值为bsonhttp://bsonspec.org/数 据的类型值
db.colls.find( { a : { $type : 2 } } ); // 匹配a为string类型数据
db.colls.find( { a : { $type : 16 } } ); // 匹配a为int类型数据

使用正则表达式匹配
db.colls.find( { name : /acme.*corp/i } );//类似于SQL中like

内嵌对象查询
db.colls.find( { “author.name” : “joe” } );

1.3.3版本及更高版本包含$not查询
db.colls.find( { name : { $not : /acme.*corp/i } } );
db.colls.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );

sort()排序
db.colls.find().sort( { ts : -1 } );//1为升序2为降序

limit()对限制查询数据返回个数
db.colls.find().limit(10)

skip()跳过某些数据
db.colls.find().skip(10)

snapshot()快照保证没有重复数据返回或对象丢失

count()统计查询对象个数
db.students.find({‘address.state' : ‘CA'}).count();//效率较高
db.students.find({‘address.state' : ‘CA'}).toArray().length;//效率很低

group()对查询结果分组和SQL中group by函数类似
distinct()返回不重复值 

==========

由于公司系统使用MongoDB,虽然之前了解,但并没有深入学习MongoDB。见此机会,参考《MongoDB 权威指南》深入学习,结合对比MySQL,加深对两种不同数据库的理解。特把学习过程记录和大家分享。

一、 表结构对比

表结构对比MongoDBMySQL
collectionstables
documentsrows
主键_idid 与业务无关的值作为主键。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID
主键生成策略24位的字符串(time + machine + pid + inc),自己指定UUID, 自增
面向Documents数据库TF
面向行数据库FT
约束主键约束,外键约束

二、 数据类型对比

数据类型对比MongoDBMySQL
整形NumberInt("3"),NumberLong("3")TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
浮点默认使用64位浮点型数值FLOAT, DOUBLE, DECIMAL
字符utf8 字符串VARCHAR, CHAR
日期/时间new Date(), 自新纪元依赖经过的毫秒数,不存储时区DATE, DATETIME, TIMESTAMP
NULLnull不支持(null与null不相等)
布尔类型true/false不支持
正则表达式支持 { "x" : /foobar/i }不支持
数组支持 { "x" : ["a", "b", "c"]}不支持
二进制数据支持 GridFSBLOB, TEXT
代码片段{ "x" : function() { /... / } }不支持

三、 SHELL终端对比

对比项MongoDBMySQL
启动mongomysql -u root -p
查看库show dbsshow databases
使用库use testuse test
查看表show collectionsshow tables

四、 查询对比

查询对比MongoDBMySQL
检索单列db.users.find({ "age" : 27 })SELECT * FROM users WHERE age = 27;
检索多列db.users.find({ "age" : 27, "username" : "joe" })SELECT * FROM users WHERE age = 27 and username = 'joe';
指定需要返回的键db.users.find({}, { "username" : 1, "email" : 1 })SELECT username, email FROM users;
范围检索db.users.find({"age" : { "$gte" : 18, "$lte" : 30 }}) $lt, $lte, $gt, $gte 分别对应 <, <=, >, >=SELECT * FROM users WHERE age >= 18 AND age <=30;
不匹配检索db.users.find({ "username" : { "$ne" : "joe" } })SELECT * FROM users WHERE username <> 'joe';
IN 操作符db.raffle.find({ "ticket_no" : { "$in" : [725, 542, 390] } }) $in非常灵活,可以指定不同类型 的条件和值。 例如在逐步将用户的ID号迁移成用户名的过程中, 查询时需要同时匹配ID和用户名SELECT ticket_no FROM raffles WHERE ticket_no IN (725, 542, 390);
NOT IN 操作符db.raffle.find({ "ticket_no" : { "$nin" : [725, 542, 390] } })SELECT * FROM raffles WHERE ticket_no not in (725, 542, 390);
OR 操作符db.raffle.find({ "$or" : [{ "ticket_no" : 725 }, { "winner" : true }] })SELECT * FROM raffles WHERE ticket_no = 725 OR winner = 'true';
空值检查db.c.find({"y" : null}) null不仅会匹配某个键的值为null的文档 ,而且还会匹配不包含这个键的文档。 所以,这种匹配还会返回缺少这个键的所有文档。 如果 仅想要匹配键值为null的文档, 既要检查改建的值是否为null, 还要通过 $exists 条件 判定键值已经存在 db.c.find({ "z" : { "$in" : [null], "$exists" : true }})SELECT * FROM cs WHERE z is null;
多列排序db.c.find().sort({ username : 1, age: -1 })SELECT * FROM cs ORDER BY username ASC, age DESC;
AND操作符db.users.find({ "$and" : [{ "x" : { "$lt" : 1 }, { "x" : 4 } }] }) 由于查询优化器不会对 $and进行优化, 所以可以改写成下面的 db.users.find({ "x" : { "$lt" : 1, "$in" : [4] } })SELECT * FROM users WHERE x > 1 AND x IN (4);
NOT 操作符db.users.find({ "id_num" : { "$not" : { "$mod" : [5,1] } } })SELECT * FROM users WHERE id_num NOT IN (5,1);
LIKE 操作符(正则匹配)db.blogs.find( { "title" : /post?/i } ) MongoDB 使用Perl兼容的正则表达式(PCRE) 库来匹配正则表达式, 任何PCRE支持表达式的正则表达式语法都能被MongoDB接受SELECT * FROM blogs WHERE title LIKE "post%";

五、 函数对比

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 }
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5 }
{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10 }
{ "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10 }
函数对比MongoDBMySQL
COUNTdb.foo.count()SELECT COUNT(id) FROM foo;
DISTINCTdb.runCommand({ "distinct": "people", "key": "age" })SELECT DISTINCT(age) FROM people;
MINdb.sales.aggregate( [ { $group: { _id: {}, minQuantity: { $min: "$quantity" } } } ]); 结果: { "_id" : { }, "minQuantity" : 1 }SELECT MIN(quantity) FROM sales;
MAXdb.sales.aggregate( [ { $group: { _id: {}, maxQuantity: { $max: "$quantity" } } } ]);SELECT MAX(quantity) FROM sales;
AVGdb.sales.aggregate( [ { $group: { _id: {}, avgQuantity: { $avg: "$quantity" } } } ]);SELECT AVG(quantity) FROM sales;
SUMdb.sales.aggregate( [ { $group: { _id: {}, totalPrice: { $sum: "$price" } } } ]);SELECT SUM(price) FROM sales;

六、 CURD 对比

CURD 对比MongoDBMySQL
插入数据post = {"title" : "My Blog Post", "content" : "Here`s my blog post"}; db.blog.insert(post) 如果blog 这个集合不存在,则会创建INSERT INTO blogs(title, blog_content) VALUES ('My Blog Post', 'Here`s my blog post.')
批量插入db.blog.batchInsert([{ "title" : "AAA", "content" : "AAA---" }, { "title" : "BBB", "content" : "JJJJ--" }]) 当前版本的MongoDB能接受最大消息长度48MB, 所以在一次批量插入中能插入的文档是有限制的。 并且在执行批量插入的过程中,有一个文档插入失败, 那么在这个文档之前的所有文档都会成功插入到集合中, 而这个文档以及之后的所有文档全部插入失败。INSERT INTO blogs(title, blog_content) VALUES('AAA', 'AAA---'), ('BBB', 'BBB---');
查询数据db.blog.find(); db.blog.findOne();SELECT * FROM blogs; SELECT * FROM blogs LIMIT 1;
更新旧数据post.blog_content = "十一"; db.blog.update({title: "My Blog Post"}, post)UPDATE set blog_content = "十一" WHERE title = "My Blog Post";
更新新增COLUMNpost.comments = "very good"; db.blog.update({title : "My Blog Post"}, post)ALTER table blogs ADD COLUMN comments varchar(200); UPDATE blogs set comments = "very good" WHERE title = 'My Blog Post';
删除数据db.blog.remove({ title : "My Blog Post" })DELETE FROM blogs WHERE title = 'My Blog Post'
校验post.blog_visit = 123; db.blog.update({title : "My Blog Post"}, post); post.blog_visit = "asd.123aaa"; db.blog.update({title : "My Blog Post"}, post) 插入的时候,检查大小。所有的文档都必须小于16MB。 这样做的目的是为了防止不良的模式设计,并且保持性能一直。由于MongoDB只进行最基本的检查,所以插入非法的数据很容易。类型校验,长度校验。 ALTER table blogs ADD COLUMN blog_visit INT(10); UPDATE blogs SET blog_visit = "asdasd" WHERE id = 1; ERROR 1366 (HY000): Incorrect integer value: 'asdasd' for column 'blog_visit' at row 1
删除表db.blog.remove({}), db.blog.drop()DELETE from blogs; drop table blogs;



免责声明:文章转载自《mongodb与mysql命令详细对比》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇moment.js的使用方法总结NPOI Word表格参照模板行按记录数量新增行下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ubuntu Apache2 配置简单介绍

  debian系列的(如Ubuntu,本人是Ubuntu 12.04的)Apache 通过 apt-get 方式安装的是 Apache2 的,是 httpd 的 2.x 版本,名字直接叫 apache2,不叫 httpd 了;里面的配置文件也没有 httpd.conf ,不过相应的目录和文件都比较清晰方便,基本的配置都在 apache2.conf 里面,...

C++ MySQL编程

MySQL编程需要包含<mysql.h>头文件。该文件一般在MySQL安装目录下的include文件夹下。 包含头文件还不够,还需要包含“libmysql.lib”库,一般在lib文件夹下。 MySQL编程与Socket编程非常相似,唯一不同的是MySQL使用的是MYSQL结构体,而Socket使用的是SOCKET。因此需要先构建一个MYSQL...

Linux下mysql修改连接超时(windows下也适用)

首先进入mysql,查看 wait_timeout、interactive_timeout这个值是否为默认的8小时(即 28800) [root@server110 ~]# mysql -u root -p Enter password: 输密码进入 执行如下命令 show variables like '%timeout%'; +-----------...

mysql分组后获取每个组排序后的第一条数据(整行)

https://blog.csdn.net/persistencegoing/article/details/92764058 All rights reserved.No part of this article may be reproduced or distributed by any means,or stored in a database o...

MySQL用户权限验证与管理方法详解

本文实例讲述了MySQL用户权限验证与管理方法。分享给大家供大家参考,具体如下: 一、Mysql权限分两阶段验证 1. 服务器检查是否允许连接:用户名、密码,主机地址。 2. 检查每一个请求是否有权限实施。 二、Mysql权限列表 权限 权限级别 权限说明 create 数据库、表或索引 创建数据库、表或索引权限 drop 数据库或表 删除数据...

mysql权限管理

1.使用密码登录mysql mysql -u root -p 2.查看所有的数据库 show databases; 3.创建数据库 create database <数据库名>; 4.创建数据库同时设置字符集  create database <数据库名> default character set utf8 collate utf...