MySQl与NoSQL(MongoDB)的对比
目前环境下,只要对事务要求不高的业务都能被MongoDB所取代,属于及其热门的NoSQL数据库
数据库结构
MongoDB属于NoSQL数据库,自然也是没有表相关概念的,该数据库存储使用的是集合,集合中存储的是文档(树状结构数据)
基本操作的语句对比
- MySQL
CREATE DATABASE 数据库名;
- MongoDB
use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
- MySQL
SHOW DATABASE
- MongoDB
show dbs: 查询所有数据库
-
MySQL
未知
-
MongoDB
db: 查询当前选择的数据库
- MySQL
use 数据库名 ;
- MongoDB
use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
- MySQL
SHOW TABLES
- MongoDB
show collections: 查询当前库中的集合
- MySQL
drop database 数据库名;
- MongoDB
db.dropDatabase(): 删除当前选中的数据库
- MySQL
CREATE TABLE table_name (column_name column_type); 创建表
- MongoDB
db.createCollection("集合名"): 创建集合
- MySQL
DROP TABLE table_name ;
- MongoDB
db.集合名.drop(): 删除集合
注意: 注意: db.集合名 == db.getCollection(“集合名”)
数据类型
- MySQL
- MongoDB
String(字符串): mongodb中的字符串是UTF-8有效的
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器
Boolean(布尔): 存储布尔(true/false)值
Double(双精度): 存储浮点值
Arrays(数组): 将数组或列表或多个值存储到⼀个键中
Timestamp(时间戳): 存储时间戳
Object(对象): 嵌⼊式⽂档
Null (空值): 存储Null值
Symbol(符号): 与字符串相同,⽤于具有特定符号类型的语⾔
Date(⽇期): 以UNIX时间格式存储当前⽇期或时间
Object ID(对象ID) : 存储⽂档ID
Binary data(⼆进制数据): 存储⼆进制数据
Code(代码): 将JavaScript代码存储到⽂档中
Regular expression(正则表达式): 存储正则表达式
语法控制集合(表)
1. 插入数据
- MySQL
NSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
- MongoDB
db.集合名.insert( 文档 ) : 往集合中插入一个文档
或
db.COLLECTION_NAME.save(document)
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
2. 删除数据
- MySQL
DELETE FROM table_name [WHERE Clause]
- MongoDB
db.collection.remove(
<query>,
<justOne>
)
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
3. 修改数据
- MySQL
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- MongoDB
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,就把按条件查出来多条记录全部更新。
4. 查询数据(基础重要)
- MySQL
ELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
你可以使用 WHERE 语句来包含任何条件。
你可以使用 LIMIT 属性来设定返回的记录数。
- MongoDB
db.collection.find(query, projection)
//实例
db.users.find({},{name:1,age:1,_id:0});
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。只有_id 这个主键列的属性才能在查询中被单独设定为0, 其他的必须要统一, 同为1或者同为0, 否则就会报错
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.collection.find().pretty()
//实例
db.users.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
5. 比较操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
- (!=) 不等 - $ne
- 集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …n 如:{name: {in: [“xiaoyao”,“bunny”]}}
- 判断存在 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …s 如:{name: {exists:true}}
点击进入菜鸟教程一个非常优秀的教学网站(表格的来源)
MongoDB 与 RDBMS Where 语句比较
操作 | 格式 | 范例 | MySQL中的类似语句 |
---|---|---|---|
等于 | {:} | db.col.find({“by”:“菜鸟教程”}).pretty() | where by = ‘菜鸟教程’ |
小于 | {:{$lt:}} | db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {:{$lte:}} | db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50``where likes > 50 |
大于 | {:{$gt:}} | db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {:{$gte:}} | db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {:{$ne:}} | db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
6. 逻辑查询
语法 -> find({列:{逻辑操作符: [条件1, 条件2, ...]}})
逻辑操作符
- (&&) 与 - $and
- (||) 或 - $or
- (!) 非 - $not
AND 条件
- MySQL
select * from users WHERE age>=28 AND age<=30
- MongoDB
db.collection.find(
{
key1:value1,
key2:value2
}
)
//实例
//查询年龄在28到30岁之间的用户信息
db.users.find({
$and:[
{age:{$gte:28}},
{age:{$lte:30}}
]
})
OR条件
- MySQL
select * from users where age<28 and age>30
- MongoDB
db.collection.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
//例:
//查询年龄小于 28 或者年龄大于 30 的用户信息
db.users.find({
$or:[
{age:{$lt:28}},
{age:{$gt:30}}
]
})
7. 模糊查询
- MySQL
SELECT * FROM uers WHERE name LIKE '%Java%';
- MongoDB
//查询 name 带 Java 的用户信息'($ 为通配符)
db.users.find({
name:{$regex:/Java$/i}
})
8. 排序查询
- MySQL
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC], [field2...] [ASC [DESC][默认 ASC]]
//实例 查询用户表中的姓名和年龄以年龄降序排序
select name,age from users order By age desc
- MongoDB
db.users.find({}).sort({字段: 1}) -> 按照字段升序排列
db.users.find({}).sort({字段: -1}) -> 按照字段降序排列
9.分页查询
- MySQL
SELECT * FROM users [WHERE Clause] [LIMIT N]
//你可以使用 LIMIT 属性来设定返回的记录数。
select * from users where name like '%java%' limit start,pageSize
- MongoDB
db.users.find({}).skip(num).limit(num)
sikp(num): 跳过num个文档,相当于start
limit(num): 限制显示num个文档,相当于pageSize
MongoDB 的特殊存储方式
直接存入数组数据
- 增加一个数组
db.users.updateMany({}, {$set:{hobby:[]}})
- 给数组字段添加一条数据
db.users.update({
name: "javaUser"
}, {
$push: {hobby:"c++"}
})
- 给数组字段添加数据, 不允许数据元素重复
db.users.update({
name: "javaUser"
}, {
$addToSet: {hobby:"java"}
})
- 使用each一次添加多条数据
db.users.update({
name: "javaUser"
}, {
$addToSet: {hobby:{$each:["git","MVC","ssm"]}}
})
- $pop 删除数组中数据, 1:删除最后一个, -1: 删除第一个
db.users.update({
name: "javaUser"
}, {
$pop:{hobby:-1}
})
- $pull 删除数组中数据, 通过指定内容删除
db.users.update({
name: "javaUser"
}, {
$pull:{hobby:"php"}
})
- 通过索引修改
db.users.update({
name: 'javaUser'
}, {
$set: {
'hobby.1': 'go'
}
})
- 修改指定的内容
db.users.update({
name: "javaUser",hobby:"ssm"
}, {
$set:{"hobby.$":"框架"}
})
- 如有错误请各位大神指导, 叩谢了!!