MySQl與NoSQL(MongoDB)的對比

目前環境下,隻要對事務要求不高的業務都能被MongoDB所取代,屬于及其熱門的NoSQL資料庫
資料庫結構
MongoDB屬于NoSQL資料庫,自然也是沒有表相關概念的,該資料庫存儲使用的是集合,集合中存儲的是文檔(樹狀結構資料)
基本操作的語句對比
-
建立資料庫
- MySQL
- MongoDB
use 資料庫名: 建立并且選中資料庫,資料庫已經存在則直接選中
-
查詢所有資料庫
- MySQL
SHOW DATABASE
- MongoDB
show dbs: 查詢所有資料庫
-
查詢目前選擇的資料庫
-
MySQL
未知
- MongoDB
db: 查詢目前選擇的資料庫
-
選擇資料庫
- MySQL
- MongoDB
use 資料庫名: 建立并且選中資料庫,資料庫已經存在則直接選中
-
查詢目前資料庫中的集合(表)
- MySQL
SHOW TABLES
- MongoDB
show collections: 查詢目前庫中的集合
-
删除資料庫
- MySQL
- MongoDB
db.dropDatabase(): 删除目前選中的資料庫
-
建立集合(表)
- MySQL
CREATE TABLE table_name (column_name column_type); 建立表
- MongoDB
db.createCollection("集合名"): 建立集合
-
删除集合(表)
- MySQL
- 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
- 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
- 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
sikp(num): 跳過num個文檔,相當于start
limit(num): 限制顯示num個文檔,相當于pageSize
MongoDB 的特殊存儲方式
直接存入數組資料
- 增加一個數組
- 給數組字段添加一條資料
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.$":"架構"}
})
- 如有錯誤請各位大神指導, 叩謝了!!