MongoDB的語(yǔ)法和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)語(yǔ)法不同,它調(diào)用的是JavaScript提供的API接口。例如:
添加數(shù)據(jù)
單行數(shù)據(jù)插入(insert)
use appdb
db.book.insert({
title: 'my first book',
publishedData : new Date(),
tags: [
'MongoDB',
'nosql'
],
favCount: 25,
author: 'zale' ,
})
WriteResult({ "nInserted" : 1 }) 表示插入數(shù)據(jù)成功
由于MongoDB屬于文檔型數(shù)據(jù)庫(kù)在跳,它不像關(guān)系型數(shù)據(jù)庫(kù)一樣有著特定的格式,所以你可以在數(shù)據(jù)庫(kù)中插入任意結(jié)構(gòu)數(shù)據(jù)隐岛,但不推薦這樣做;例如
db.book.insert({
title:'我的第一本書',
author:"liuliuliu",
icon: "這是書的封面",
utl:'http://book.zhouhc.test.com'
})
這時(shí)的數(shù)據(jù)庫(kù)中:
表結(jié)構(gòu)為:
無(wú)限制的插入猫妙,項(xiàng)目必然無(wú)法維護(hù)。
批量插入
批量插入用到的方法:
db.book.insertMany();
以下是例子:
db.book.insertMany([{
title:'批量插入',
author:'zhohc',
publishedData: new Date(),
tags:['mongo', '批量插入'],
favCount: 19
}, {
title:'批量插入',
author:'zhohc',
publishedData: new Date(),
tags:['mongo', '批量插入'],
favCount: 19
}])
該語(yǔ)句的執(zhí)行結(jié)果如下:
當(dāng)然也可以通過(guò)js腳本的方式批量插入數(shù)據(jù), 如下:
這段js腳本會(huì)向MongoDB中插入20條數(shù)據(jù).這里就不執(zhí)行,想試的可以自己去弄聚凹。
查詢文檔(find)
查詢?nèi)繑?shù)據(jù)
db.collection.find()方法可以用于集合數(shù)據(jù)的查詢割坠,代碼如下:
db.book.find()
如果查詢返回的條目數(shù)量比較多齐帚,Mongo shell則會(huì)自動(dòng)實(shí)現(xiàn)分批查詢,默認(rèn)情況下每次顯示20條數(shù)據(jù)彼哼,可以輸入it命令讀取下一批对妄。
實(shí)際上,find命令返回的是一個(gè)游標(biāo)(cursor)對(duì)象敢朱,Mongo shell對(duì)batchSize做了限制剪菱,該大小可以通過(guò)變量DBQuery.shellBatchSize修改。
使用游標(biāo)對(duì)象提供的API拴签,可以對(duì)全部結(jié)果集進(jìn)行遍歷孝常,代碼如下:
var cursor = db.book.find()
cursor.forEach(printjson)
執(zhí)行結(jié)果如下:
指定條件查詢
準(zhǔn)備數(shù)據(jù)
db.aaa.insert({id: 1, user:'zhouhc1', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 2, user:'zhouhc2', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 3, user:'zhouhc3', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 4, user:'zhouhc4', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 5, user:'zhouhc5', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 6, user:'zhouhc6', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 7, user:'zhouhc7', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 8, user:'zhouhc8', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 9, user:'zhouhc9', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 10, user:'zhouhc10', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 11, user:'zhouhc11', pwd:'hello', icon: '圖標(biāo)'})
db.aaa.insert({id: 12, user:'zhouhc12', pwd:'hello', icon: '圖標(biāo)'})
幾種常見的操作
MongoDB的比較操作符見下表
幾種邏輯運(yùn)算符
數(shù)組運(yùn)算符
- 查詢id為"1"的用戶信息
db.aaa.find({id: 1})
- 查詢用戶ID大于5的用戶信息
db.aaa.find({id: {$gt: 5}})
該語(yǔ)句執(zhí)行結(jié)果如下:
- 排序,分頁(yè)
- 查詢用戶ID大于5的用戶信息,且按照id降序
該語(yǔ)句執(zhí)行結(jié)果如下:db.aaa.find({id:{$gt: 5}}).sort({id: -1})
-
分頁(yè)查詢
分頁(yè)查詢主要有兩個(gè)參數(shù)- skip: 用于指定跳過(guò)記錄數(shù)
- limit: 用于限定返回結(jié)果數(shù)
例如:
查詢id>5的用戶,且按照每頁(yè)2條數(shù)據(jù)進(jìn)行分頁(yè),取第二頁(yè)db.aaa.find({id: {$gt: 5}}).skip(2).limit(2)
更新文檔(update)
更新操作符
基本語(yǔ)法格式
MongoDB中可以用update命令對(duì)指定的數(shù)據(jù)進(jìn)行更新,命令的格式如下:
db.{collection}.update(query, update, options)
參數(shù)說(shuō)明:
- query: 描述更新的查詢條件
- update: 描述更新的動(dòng)作以及新的內(nèi)容
- options: 描述更新的選項(xiàng)
- 更新單條數(shù)據(jù)
例如: 將id = 1的用戶,用戶名修改為liuliuliu,
db.aaa.update({id: 1},{$set: {user: 'liuliuliu'}})
該語(yǔ)句執(zhí)行結(jié)果如下:
通過(guò)查詢,可以看到id=1的數(shù)據(jù)user已經(jīng)更新了
默認(rèn)情況下,update命令在更新第一個(gè)文檔之后返回。(也就是說(shuō)蚓哩,默認(rèn)情況下update命令只更新一個(gè)文檔),如果需要更新多條數(shù)據(jù)构灸,如下
- 更新多條數(shù)據(jù)
更新多條數(shù)據(jù)用到Options參數(shù)multi
參數(shù)介紹
- multi: 是否更新多條數(shù)據(jù),默認(rèn)false
基礎(chǔ)語(yǔ)法如下:
db.aaa.update(
{id: {$gt : 10}},
{$set: {user: 'liuliuliu'}},
{multi: true}
)
上面這個(gè)更新語(yǔ)句是說(shuō):將所有用戶id>10的用戶岸梨,user修改為liuliuliu
通過(guò)命令可以看到喜颁,id in (11,12)的兩條數(shù)據(jù)已經(jīng)修改為:liuliuliu了
- 其他指令
updateOne: 更新單個(gè)文檔
updateMany: 更新多個(gè)文檔
replaceOne: 替換單個(gè)文檔
-
findAndMondify: 這個(gè)命令兼容查詢和修改指定文檔的功能,如下圖
請(qǐng)?zhí)砑訄D片描述默認(rèn)返回的是舊數(shù)據(jù)曹阔,可以通過(guò)選項(xiàng): new:true,返回最新的結(jié)果
例如:
請(qǐng)?zhí)砑訄D片描述
- 其他
-
upsert命令
upsert是一種特殊的更新的命令半开,其表現(xiàn)為如果目標(biāo)文檔不存在,則執(zhí)行插入命令次兆,代碼如下:
請(qǐng)?zhí)砑訄D片描述
刪除文檔(delete)
刪除單個(gè)文檔
執(zhí)行下面的命令可以刪除單個(gè)文檔
db.aaa.remove({id:11})
可以看到文檔已經(jīng)刪除了稿茉, 查詢結(jié)果如下
注意:刪除命令會(huì)刪除所有匹配條件的全部文檔,如果希望明確限定只刪除一個(gè)文檔芥炭,則需要指定justOne參數(shù)漓库。
命令格式如下:
db.collection.remove({
<query>,
<justOne>
})
例如:
db.collection.remove({id: 1}, true)
在MongoDB 3.2版本提供了delete語(yǔ)法定義,因此也可以使用deleteOne命令實(shí)現(xiàn)刪除單個(gè)文檔园蝠。
例如:
db.aaa.deleteOne({user: 'liuliuliu'})
刪除全部文檔
刪除全部文檔有三種方式渺蒿,如下:
db.aaa.remove({})
db.aaa.deleteMany({})
db.aaa.drop()
方式1、2需要對(duì)查詢范圍內(nèi)的文檔逐個(gè)刪除彪薛,如果希望刪除整個(gè)集合(表)茂装,則使用drop命令會(huì)更加高效。
drop命令會(huì)同時(shí)刪除集合的全部索引善延。
返回被刪除的數(shù)據(jù)
如果希望返回刪除的數(shù)據(jù)可以使用命令:findOneAndDelete命令少态, 示例如下:
db.aaa.findOneAndDelete({id: 10})
執(zhí)行結(jié)果如下:
小結(jié)
參考
《MongoDB進(jìn)階與實(shí)戰(zhàn):微服務(wù)整合、性能優(yōu)化易遣、架構(gòu)管理》