芒果db的基本操作
芒果數(shù)據(jù)庫(kù)
芒果數(shù)據(jù)庫(kù)是NOSQL的一種,是一種面向文檔的數(shù)據(jù)庫(kù),介于結(jié)構(gòu)化數(shù)據(jù)庫(kù)和非結(jié)構(gòu)數(shù)據(jù)庫(kù)的一種,它的數(shù)據(jù)結(jié)構(gòu)非常松散,也非常靈活
優(yōu)點(diǎn)
-
面向文檔存儲(chǔ)(類JSON數(shù)據(jù)模式簡(jiǎn)單而強(qiáng)大)
-
動(dòng)態(tài)查詢
-
全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組
-
查詢記錄分析
-
快速,就地更新
-
高效存儲(chǔ)二進(jìn)制大對(duì)象 (比如照片和視頻)
-
復(fù)制和故障切換支持
-
Auto- Sharding自動(dòng)分片支持云級(jí)擴(kuò)展性
-
MapReduce 支持復(fù)雜聚合
-
商業(yè)支持,培訓(xùn)和咨詢
缺點(diǎn)
-
不支持事務(wù)(進(jìn)行開(kāi)發(fā)時(shí)需要注意,哪些功能需要使用數(shù)據(jù)庫(kù)提供的事務(wù)支持)
-
MongoDB占用空間過(guò)大 (不過(guò)這個(gè)確定對(duì)于目前快速下跌的硬盤(pán)價(jià)格來(lái)說(shuō),也不算什么缺點(diǎn)了)
-
MongoDB沒(méi)有如MySQL那樣成熟的維護(hù)工具,這對(duì)于開(kāi)發(fā)和IT運(yùn)營(yíng)都是個(gè)值得注意的地方
-
在32位系統(tǒng)上,不支持大于2.5G的數(shù)據(jù)(很多操作系統(tǒng)都已經(jīng)拋棄了32位版本,所以這個(gè)也算不上什么缺點(diǎn)了,3.4版本已經(jīng)放棄支持32 位 x86平臺(tái))
數(shù)據(jù)存儲(chǔ)階段
文件管理階段(.txt .doc .xls)
優(yōu)點(diǎn) : 使用簡(jiǎn)單方便 數(shù)據(jù)能夠長(zhǎng)期保存 可以存儲(chǔ)大量數(shù)據(jù)
缺點(diǎn) : 數(shù)據(jù)一致性差 數(shù)據(jù)的查找修改不方便 數(shù)據(jù)冗余
數(shù)據(jù)庫(kù)管理階段
優(yōu)點(diǎn) : 數(shù)據(jù)組織結(jié)構(gòu)化,降低冗余 提高增刪改查效率 方便擴(kuò)展 方便程序調(diào)用,做自動(dòng)化的處理 缺點(diǎn) : 數(shù)據(jù)庫(kù)使用特定的語(yǔ)句操作,相對(duì)復(fù)雜
mysql 和 mongodb 概念比價(jià)
mysql mongodb 含義
database database 數(shù)據(jù)庫(kù)
table collection 表/集合
column field 字段/域
row document 記錄/文檔
index index 索引
操作
啟動(dòng)
雙擊mongo.exe
查看當(dāng)前系統(tǒng)中的數(shù)據(jù)庫(kù)
show dbs
系統(tǒng)數(shù)據(jù)庫(kù): admin:存放用戶及其權(quán)限 local: 存儲(chǔ)本地?cái)?shù)據(jù) config:存儲(chǔ)分片信息
使用指定數(shù)據(jù)庫(kù)
use 庫(kù)名
創(chuàng)建庫(kù)
use str
剛創(chuàng)建不會(huì)成功,只有使用,才會(huì)成功
db.createCollection("class1")
刪除庫(kù)
db.dropDatabase()
刪除db代表的數(shù)據(jù)庫(kù)
創(chuàng)建集合
db.createCollection(collection_name)
創(chuàng)建一個(gè)class1的集合
例: db.createCollection("class1")
當(dāng)向一個(gè)集合中插入數(shù)據(jù)的時(shí)候,如果這個(gè)集合不存在則會(huì)自動(dòng)創(chuàng)建
例: db.class2.insert({"name":'Tom','age':17,'sex':'m'})
查看數(shù)據(jù)庫(kù)中的集合
方式一:show collections
方式二:show tables
刪除集合
db.collectionName.drop()
列: db.class1.drop()
集合的重命名
db.collectionName.renameCollection("new_name")
列:db.class2.renameCollection("class1")
文檔
mongodb中數(shù)據(jù)的組織形式--》文檔
芒果db文檔:以鍵值對(duì)形式組成的類似字典的數(shù)據(jù)結(jié)構(gòu)
鍵:即文檔的域
鍵的命名規(guī)則: \1. utf-8字符串 \2. 不含有'\0' 通常不用 . $ \3. 一個(gè)文檔中的鍵不能重復(fù)
* 文檔中的鍵值對(duì)是有序的 * mongodb中數(shù)據(jù)嚴(yán)格區(qū)分大小寫(xiě)
值:即文檔存儲(chǔ)的數(shù)據(jù),支持bson數(shù)據(jù)
JavaScript ---》 json ---》bson
類型 值
整型 整數(shù) 布爾類型 true false 浮點(diǎn)型 小數(shù) Array 數(shù)組 Timestamp 時(shí)間戳 Date 時(shí)間日期 Object 內(nèi)部文檔 Null 空值 null String 字符串 Symbol 特殊字符串 Binary data 二進(jìn)制字串 code 代碼 regex 正則表達(dá)式 ObjectId ObjectId字串
"_id" : ObjectId("5b503b7f38d0e992e1270560")
_id : 當(dāng)在mongo代表中插入文檔時(shí),如果不指定id則會(huì)自動(dòng)添加這個(gè)域,作為主鍵。
ObjectId() 值是系統(tǒng)自動(dòng)生成的不重復(fù)字串標(biāo)識(shí)
24位 8位 文檔創(chuàng)建時(shí)間 6位 機(jī)器ID 4位 進(jìn)程ID 6位 計(jì)數(shù)器
集合中的文檔:
集合中的文檔: \1. 集合中的文檔不一定有相同的域 \2. 集合中的文檔多少不一定相同 \3. 集合中的文檔,值的類型不一定相同
集合設(shè)計(jì) \1. 集合中的文檔盡可能描述同一類數(shù)據(jù) \2. 同一類數(shù)據(jù)不要過(guò)多分散在多個(gè)集合中存放 \3. 集合中文檔的結(jié)構(gòu)層次不宜過(guò)多
插入文檔
插入單個(gè)文檔
db.collectionName.insert()
例:db.class0.insert({name:"HanMei",age:17,sex:'w'})
查看插入結(jié)果
db.class0.find()
* 插入數(shù)據(jù)時(shí)域名可以不加引號(hào) * 查看插入結(jié)果 db.class.find() * id 為系統(tǒng)自動(dòng)添加主鍵,如果自己寫(xiě)id則為自己設(shè)定的值,但是仍然不可重復(fù) * 一個(gè)集合中的文檔是有序的
插入多個(gè)文檔
db.collectionName.insert([{},{},{}])
例:db.class2.insert([{name:'阿寶',age:32},{name:'阿哲',age:31},{name:'阿蓉',age:26}])
查看插入結(jié)果
db.class2.find()
save() 插入文檔 save() 也可以用來(lái)插入多條數(shù)據(jù) 如果正常插入與insert相同 當(dāng)插入指定_id值重復(fù)的數(shù)據(jù)時(shí)save()可以對(duì)原數(shù)據(jù)進(jìn)行修改,但是insert()會(huì)報(bào)錯(cuò)
使用save插入
db.collectionName.save()
例:db.class1.save({name:'Lily',age:13,sex:'w'})
查看插入結(jié)果
db.class1.find()
* 如果不加id域時(shí)用法同insert() * 如果加id,此_id值存在則save表示修改該文檔。
MongoDB 文檔型數(shù)據(jù)庫(kù)總結(jié)
創(chuàng)建數(shù)據(jù)庫(kù): use database 刪除數(shù)據(jù)庫(kù): db.dropDatabase()
創(chuàng)建集合: db.createCollection() db.collection.insert() 刪除集合: db.collection.drop() 重命名 : db.collection.renameCollection()
查看數(shù)據(jù)庫(kù)
查看數(shù)據(jù)庫(kù): show dbs
查看集合
查看集合: show collections show tables
文檔
www.mongodb.com --> docs 查找文檔幫助
插入文檔 : insert() save()
獲取集合對(duì)象
db.getCollection('class1') ===》 db.class1
插入數(shù)據(jù)
db.getCollection('class1').insert({name:'Marry',age:16,sex:'w'})
查找操作
mysql : select ... from table where ....
mongo : db.collection.find(query,field)
查找所有內(nèi)容 db.collection.find() ----> select * from table
find(query,field) 功能 : 查找數(shù)據(jù) 參數(shù) : query: 篩選條件,相當(dāng)于where子句 field: 選定要展示的域 返回值 : 返回查找到的文檔
query : 以鍵值對(duì)形式給出篩選條件 {name:'Lily'}
查找所有內(nèi)容
db.collection.find(query,field)
查找所有
例: db.class1.find()
按條件查找
例:db.class1.find({name:'Lily'})
field : 以鍵值對(duì)的形式給出要展示(不展示)的域,域名為鍵,值為1表示展示,0表示不展示
* 如果某個(gè)域設(shè)置為0則表示不展示該域其他的均展示 * 如果某個(gè)域設(shè)置為1則表示展示該域其他的均不展示 * id必須設(shè)置為0才不會(huì)顯示 * 除了id其余設(shè)置的值必須相同
以鍵值對(duì)形式展示
db.class1.find({name:'Lily'},{_id:0,name:1,age:1})
db.class1.find({name:'Lily'},{_id:0,name:1})
db.class1.find({name:'Lily'},{_id:0})
0是該域不展示,其他均展示
1是該域展示,其他不展示
只查找第一條符合條件的文檔
findOne(query,field)
參數(shù)返回值同find()
例: db.class1.findOne({sex:'w'},{_id:0})
query 更多篩選功能
操作符:使用$符號(hào)標(biāo)注的一個(gè)有特殊意義的字符串。用以表達(dá)一定的含義。比如 $lt 表示小于
比較操作符
$eq 等于 =
例:db.class1.find({age:{$eq:13}},{_id:0})
db.class1.find({age:13},{_id:0})
$lt 小于 <
例:db.class1.find({age:{$lt:15}},{_id:0})
* 字符串也可以比較大小
$lte 小于等于 <=
小于等于15
例:db.class1.find({age:{$lte:15}},{_id:0})
$gt 大于 >
大于15 db.class1.find({age:{$gt:15}},{_id:0})
$gte 大于等于 >=
大于等于15 db.class1.find({age:{$gte:15}},{_id:0})
$ne 不等于 !=
不等于13 db.class1.find({age:{$ne:13}},{_id:0})
* 如果某個(gè)文檔不存在查找的域,則不等于可以匹配到該文檔
$in 包含
年齡包含 在11,12,13,14的
db.class1.find({age:{$in:[11,12,13,14]}},{_id:0})
$nin 不包含
年齡不是13,14 db.class1.find({age:{$nin:[13,14]}},{_id:0})
邏輯操作符
query 逗號(hào)分隔的條件即為與關(guān)系
,表示關(guān)系
年齡大于13 小于16
db.class1.find({age:{$gt:13,$lt:16}},{_id:0})
年齡大于13且性別為女
db.class1.find({age:{$gt:13},sex:'w'},{_id:0})
$and 邏輯與
年齡大于13 并且姓名大于Lily
db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0})
$or 邏輯或
年齡大于15或者為男生
$not 邏輯非
年齡不大于15
db.class1.find({age:{$not:{$gt:15}}},{_id:0})
$nor 既不也不
既不大于16 也不是女生
db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0})
條件混合
年齡大于16并且為男生 或者 年齡小于14
db.class1.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})
年齡大于16或者為女生 并且 姓名大于 Jame
db.class1.find({name:{$gt:'Jame'},$or:[{age:{$gt:16}},{sex:'w'}]},{_id:0})
數(shù)組
[1,2,3,4]
數(shù)組查找
查看數(shù)據(jù)中是否包含某一項(xiàng)
如果score數(shù)組中包含67即可
db.class3.find({score:67},{id:0}) db.class3.find({score:{$gt:90}},{id:0})
$all
查看數(shù)據(jù)中同時(shí)包含多項(xiàng)
同時(shí)包含64 75
db.class3.find({score:{$all:[64,75]}},{_id:0})
$size
通過(guò)數(shù)組元素個(gè)數(shù)查找
db.class3.find({score:{$size:3}},{_id:0})
$slice
取出數(shù)組的部分進(jìn)行顯示 放在field中
顯示數(shù)組中前兩項(xiàng) db.class3.find({},{id:0,score:{$slice:2}})
跳過(guò)第一項(xiàng)顯示后面一項(xiàng) db.class3.find({},{id:0,score:{$slice:[1,1]}})
其他查找方法
$exists
判斷一個(gè)域是否存在
查找存在age域的文檔
db.class1.find({age:{$exists:true}},{_id:0} )
true 表示有這個(gè)域 false表示篩選無(wú)這個(gè)域
$mod
余數(shù)查找
查找除以2余數(shù)為1的 db.class1.find({age:{$mod:[2,1]}},{_id:0} )
$type
找出值為指定類型的文檔
查找age數(shù)據(jù)類型為1的文檔 db.class1.find({age:{$type:1}},{_id:0} )
具體數(shù)字和類型的匹配 Type Number Double 1 String 2 Object 3 Array 4 Binary data 5 ObjectId 7 Boolean 8 Date 9 Null 10 RE 11 Symbol 14 32-bit integer 16 Timestamp 17 64-bit integer 18
查找結(jié)果相關(guān)函數(shù)
distinct()
功能:查看集合某個(gè)域的取值范圍
查看集合中age域值的范圍 db.class1.distinct("age")
pretty()
功能: 格式化顯示查找結(jié)果
db.class1.find().pretty()
limit(n)
功能: 顯示查找結(jié)果的前n條
顯示查找結(jié)果的前三條 db.class1.find({},{_id:0}).limit(3)
skip(n)
功能 : 跳過(guò)前n條顯示
跳過(guò)前三條顯示后邊的內(nèi)容 db.class1.find({},{_id:0}).skip(3)
count()
功能 : 計(jì)數(shù)統(tǒng)計(jì)
統(tǒng)計(jì)男生數(shù)量 db.class1.find({sex:'m'},{_id:0}).count()
sort({域:1/-1})
功能 : 對(duì)查找結(jié)果排序 參數(shù) : 以鍵值對(duì)的形式給出 1 表示按照升序排序, -1表示降序排序
按照年齡升序 db.class1.find({},{_id:0}).sort({age:1})
復(fù)合排序:當(dāng)?shù)谝慌判蝽?xiàng)相同時(shí)比較第二排序項(xiàng)
db.class0.find({},{_id:0}).sort({age:1,name:1})
函數(shù)的連續(xù)調(diào)用 當(dāng)函數(shù)返回文檔集合時(shí)還可以繼續(xù)調(diào)用函數(shù)
查找班級(jí)年齡最大的三個(gè) db.class1.find({},{_id:0}).sort({age:-1}).limit(3)
文檔的刪除操作
delete from table where ...
db.collection.remove(query,justOne) 功能 : 刪除文檔 參數(shù) : query 篩選要?jiǎng)h除的文檔 相當(dāng)于where 用法同查找 justOne : 布爾值,默認(rèn)為false 表示刪除所有。如果設(shè)置為true 只刪除第一條符合條件的文檔。
例子:db.class2.remove({name:"阿蓉"})
justOne為true則只刪除第一條符合條件的
例:db.class0.remove({age:17},true)
刪除集合中所有文檔
刪除class2中所有文檔 db.class2.remove({})
練習(xí) :
\1. 創(chuàng)建數(shù)據(jù)庫(kù) 名字 grade use grade \2. 數(shù)據(jù)庫(kù)中創(chuàng)建集合 class \3. 集合中插入文檔,格式如下 {name:'zhang',age:10,sex:'m',hobby:['a','b']} age范圍 4-15 hobby 范圍 [draw dance sing pingpong basketball football running computer]
\4. 查找練習(xí) 查看班級(jí)所有人信息 db.class.find({},{_id:0})
查看班級(jí)年齡8歲的同學(xué)信息 db.class.find({age:8},{id:0}) 查看年齡大于10歲的學(xué)生信息 db.class.find({age:{$gt:10}},{id:0}) 查看年齡在8-11歲之間的學(xué)生信息 db.class.find({$and:[{age:{$gt:8}},{age:{$lt:11}}]},{_id:0})
查看年齡為9歲且為男生的學(xué)生 db.class.find({age:9,sex:'m'},{_id:0})
找到年齡小于7歲或大于12歲的學(xué)生 db.class.find({$or:[{age:{$lt:7}},age:{$gt:12}],{id:0}) 找到年齡為8歲或者11歲的學(xué)生 db.class.find({$or:[{age:8},{age:11}]},{id:0}) db.class.find({age:{$in:[8,11]}})
找到有兩項(xiàng)興趣愛(ài)好的學(xué)生 db.class.find({hebby:{$size:2}},{_id:0})
找到興趣中有draw的學(xué)生 db.class.find({hebby:draw},{_id:0})
找喜歡畫(huà)畫(huà)又喜歡跳舞的學(xué)生 db.class.find({hebby:{$all:['draw','dance']}})
統(tǒng)計(jì)興趣有三項(xiàng)的學(xué)生人數(shù) db.class.find({hebby:{%size:3}}).count
找到本班年齡第二大的同學(xué) db.class.sort({age:-1}).skip(1).limit(1)
查看本班學(xué)生興趣愛(ài)好涵蓋哪些方面 db.class.distinct('hebby')
找到年齡最大的三個(gè)同學(xué) db.class.sort({age:-1}).limit(3)
\5. 刪除所有年齡大于12或者小于7歲的同學(xué)除非他的愛(ài)好有三項(xiàng)以上 db.class.remove({$and:[{$or:[{age:{$gt:12}},{age:{$lt:7}}]},{hebby:{$size:{$lt:3}}}]}
修改操作
update table set ... where ...
db.collection.update(query,update,upsert,multi) 功能 : 修改文檔 參數(shù) : query : 篩選需要修改的文檔,相當(dāng)where 用法同查找 update: 要修改什么內(nèi)容 相當(dāng)set。往往需要配合修改操作符 upsert:bool值 默認(rèn)false 如果query的文檔不存在則不做操作 設(shè)置為true 則如果文檔不存在根據(jù)query和update內(nèi)容插入新文檔 multi: bool值 默認(rèn)false 如果篩選到多條文檔則只修改第一條。 設(shè)置為true則表示修改所有篩選到的文檔
e.g. 年齡修改為18 db.class0.update({name:'HanMei'},{$set:{age:18}})
e.g. 如果篩選內(nèi)容不存在則插入 db.class0.update({name:'Jame'},{$set:{age:18}},true)
e.g. 如果匹配到多條,則修改所有 db.class0.update({sex:'w'},{$set:{name:'小芳'}},false,true)
第三天
復(fù)習(xí) :
\1. 查找操作 find(query,field) findOne()
操作符 : 比較 $lt $lte $gt $gte $ne $eq $in $nin 邏輯 $and $or $not $nor
數(shù)組 $all $size
其他 $exists $mod $type
\2. 函數(shù) : pretty() limit() skip() sort() count() 其他函數(shù): distinct() getCollection()
\3. 刪除文檔 remove(query,justOne) remove({})
\4. 修改操作 update(query,update,upsert,multi)
==================================================
修改操作符
$set 修改一個(gè)域的值,或者增加一個(gè)域
e.g. 修改功能 如果該域不存在則增加這個(gè)域 db.class0.update({age:20},{$set:{name:'小薇'}})
$unset 刪除一個(gè)域
e.g. sex后面為空表示刪除一個(gè)域 db.class0.update({name:'Jame'},{$unset:{sex:''}})
$rename 修改一個(gè)域的名稱
e.g. 將sex域名修改為gender db.class0.update({},{$rename:{sex:'gender'}},false,true)
$setOnInsert 如果update執(zhí)行了插入文檔操作,表示補(bǔ)充插入內(nèi)容
e.g. 如果執(zhí)行插入操作則將setOnInsert中內(nèi)容也插入 db.class0.update({name:'Tom'},{$set:{age:17},$setOnInsert:{gender:'m',tel:'12345'}},true) 00 * 在update參數(shù)中可以同時(shí)寫(xiě)多個(gè)修改器
$inc
加減修改器
e.g. 所有人年齡增加1 db.class0.update({},{$inc:{age:1}},false,true)
* $inc值可以是正數(shù)負(fù)數(shù)整數(shù)小數(shù)
$mul
乘法修改器
e.g. Tom年齡 乘以2 db.class0.update({name:'Tom'},{$mul:{age:2}})
* $mul值可以是正數(shù)負(fù)數(shù)整數(shù)小數(shù)
$max
指定了某個(gè)域值的下限,如果小于指定值則修改為指定值
e.g. 將年齡不到20的修改為20 db.class0.update({},{$max:{age:20}},false,true)
$min
指定了某個(gè)域值的上限,如果大于指定值則修改為指定值
e.g. 年齡大于25的修改為25 db.class0.update({},{$min:{age:25}},false,true)
數(shù)組修改器
$push 向數(shù)組中添加一項(xiàng)
e.g. db.class3.update({name:'小明'},{$push:{score:5}})
$pushAll 向數(shù)組中添加多項(xiàng)
e.g. db.class3.update({name:'小紅'},{$pushAll:{score:[5,10]}})
$pull 從數(shù)組中刪除一項(xiàng)
e.g. db.class3.update({name:'小紅'},{$pull:{score:10}})
*數(shù)組可以有重復(fù)值,如果刪除則會(huì)把所有指定的值都刪除
$pullAll 刪除數(shù)組中多項(xiàng)
e.g. db.class3.update({name:'小明'},{$pullAll:{score:[67,5]}})
$each 對(duì)多個(gè)值逐一操作
e.g. db.class3.update({name:'小明'},{$push:{score:{$each:[5,10]}}})
$position 指定插入位置
e.g. 需要搭配$each使用,將數(shù)據(jù)從1號(hào)位置插入 db.class3.update({name:'小紅'},{$push:{score:{$each:[10],$position:1}}})
$sort 對(duì)數(shù)組進(jìn)行排序
e.g. 和each一起使用,對(duì)數(shù)組score進(jìn)行排序 db.class3.update({name:'小紅'},{$push:{score:{$each:[],$sort:1}}})
$pop 彈出一項(xiàng)
e.g. 1表示彈出最后一項(xiàng) -1表示刪除第一項(xiàng) db.class3.update({name:'小紅'},{$pop:{score:-1}})
$addToSet 向數(shù)組中添加一項(xiàng),不能和已有的內(nèi)容重復(fù)
e.g. 添加87,不能和已有數(shù)據(jù)重復(fù) db.class3.update({name:'小紅'},{$addToSet:{score:87}})
時(shí)間類型
mongodb中存儲(chǔ)時(shí)間格式 : ISODate()
方法1 : new Date() 自動(dòng)生成當(dāng)前時(shí)間
e.g. db.class2.insert({title:'Python入門',date:new Date()})
方法2 : ISODate() 生成當(dāng)前時(shí)間
e.g. db.class2.insert({title:'Python精通',date:ISODate()})
方法3 Date() 將生成的當(dāng)前時(shí)間變?yōu)樽址鎯?chǔ)
e.g. db.class2.insert({title:'Python瘋狂',date:Date()})
ISODate()
功能 : 生成時(shí)間類型存儲(chǔ) 參數(shù) : 參數(shù)指定時(shí)間 "2018-07-01 12:10:56" "20180701 12:10:56" "20180701"
e.g. db.class2.insert({title:'Python崩潰',date:ISODate("2018-07-01 01:12:12")})
時(shí)間戳
valueOf() 將時(shí)間轉(zhuǎn)換為時(shí)間戳
e.g. db.class2.insert({title:'Python放生',date:ISODate().valueOf()})
Null ----》 null
\1. 如果某個(gè)域存在卻沒(méi)有值,可以設(shè)置為null
e.g. db.class2.insert({title:'Python涅槃',price:null})
\2. 如果某個(gè)域不存在可以使用null匹配
e.g. 找到date域不存在的文檔 db.class2.find({date:null},{_id:0})
Object 內(nèi)部文檔
文檔內(nèi)某個(gè)域的值還是一個(gè)文檔,則這個(gè)文檔為內(nèi)部文檔
* 當(dāng)需要使用內(nèi)部文檔某個(gè)域的時(shí)候,可以使用外部文檔 . 的方法引用內(nèi)部文檔。但是注意此時(shí)需要加引號(hào)
e.g. db.class4.find({'book2.title':'python Web'},{_id:0})
e.g. db.class4.update({'book1.title':'python爬蟲(chóng)'},{$set:{'book1.price':48.8}})
數(shù)組的下標(biāo)引用
* 使用數(shù)組時(shí),可以使用數(shù)組域 . 數(shù)組序列下標(biāo)的方式引用數(shù)組的具體某一項(xiàng)
e.g. db.class3.find({'score.0':98},{_id:0})
e.g. db.class3.update({name:'小明'},{$set:{'score.0':100}})
查找結(jié)果的有序性
即可以對(duì)find的查找結(jié)果使用[]的方式引用具體某一條
e.g. db.class1.find({},{_id:0})[1]
練習(xí) : 使用之前的grade數(shù)據(jù)庫(kù)
\1. 將小紅年齡修改為8歲,興趣愛(ài)好變?yōu)樘璁?huà)畫(huà) {$set:{age:8,hobby:[‘draw’,'dance']}}
\2. 追加小明興趣愛(ài)好 唱歌 {$push:{hobby:'sing'}}
\3. 追加小王興趣愛(ài)好,吹牛,打籃球 {$pushAll:{hobby:['chuiniu','basketball']}}
\4. 小李興趣多了跑步唱歌,但是要確保和之前的不重復(fù) {$addToSet:{hobby:{$each:['running','sing']}}}
\5. 班級(jí)所有人年齡加1 {$inc:{age:1}},false,true
\6. 刪除小明的sex屬性 {$unset:{sex:''}}
\7. 刪除小李的第一個(gè)愛(ài)好 {$pop:{hobby:-1}}
\8. 刪除小紅的興趣畫(huà)畫(huà)和唱歌 {$pullAll:{hobby:['draw','sing']}}
索引
指建立指定鍵值對(duì)及所在文檔中存儲(chǔ)位置的對(duì)照清單。使用索引可以方便我們快速查找,減少遍歷次數(shù),提高查找效率。
mongodb創(chuàng)建索引
ensureIndex()
功能 : 創(chuàng)建索引 參數(shù) : 索引域,索引類別和選項(xiàng)
e.g. 根據(jù)name 創(chuàng)建索引 db.class1.ensureIndex({name:1})
* 1表示正序 -1逆序
查看一個(gè)集合中的索引
db.class1.getIndexes()
* _id是系統(tǒng)自動(dòng)創(chuàng)建的索引
自定義索引名稱
db.class1.ensureIndex({name:1},{name:'name_index'})
刪除索引
dropIndex()
功能 : 刪除索引 參數(shù) : 要?jiǎng)h除的索引,可以是索引名稱或者索引鍵值對(duì)
e.g. db.class1.dropIndex('age_index') e.g. db.class1.dropIndex({name:-1})
dropIndexes() 刪除所有索引 除了_id
e.g. db.class1.dropIndexes()
索引類型
復(fù)合索引 根據(jù)多個(gè)域創(chuàng)建一個(gè)索引
e.g. db.class1.ensureIndex({name:1,age:-1})
數(shù)組和子文檔索引
如果對(duì)某個(gè)域創(chuàng)建索引,值為數(shù)組或者子文檔,則通過(guò)數(shù)組或子文檔進(jìn)行查找時(shí)也是索引查找
覆蓋索引
查找返回的內(nèi)容,僅僅是索引表存儲(chǔ)的內(nèi)容,不需要再去原數(shù)據(jù)庫(kù)查找
唯一索引
創(chuàng)建索引時(shí)希望集合中創(chuàng)建索引的域的值均不重復(fù)
e.g. db.class1.ensureIndex({name:1},{unique:true})
* 創(chuàng)建唯一索引的域的值不可以重復(fù)
稀疏索引(間隙索引)
只針對(duì)有指定域的文檔創(chuàng)建索引表,如果某個(gè)文檔沒(méi)有該域則不做索引處理
e.g. 創(chuàng)建age域的稀疏索引 db.class1.ensureIndex({age:1},{sparse:true})
索引約束 \1. 當(dāng)數(shù)據(jù)發(fā)生更新 ,索引也要隨之更新。影響插入,修改,刪除操作的效率 \2. 索引表也需要占有一定的磁盤(pán)空間
綜上 :當(dāng)數(shù)據(jù)量比較小,或者需要頻繁的進(jìn)行數(shù)據(jù)修改操作而不是查找操作的時(shí)候,不適合創(chuàng)建索引
聚合操作
對(duì)文檔的更高級(jí)的篩選整理統(tǒng)計(jì)
db.collection.aggregate() 功能 : 聚合函數(shù),完成聚合操作 參數(shù) : 聚合條件 ---》 聚合操作符
聚合操作符
$group 分組聚合 需要配合分組統(tǒng)計(jì)操作符使用 $sum : 求和 e.g. db.class1.aggregate({$group:{_id:'$sex', 分組 按sex內(nèi)容分組 num: {$sum:1}}}) 自定義統(tǒng)計(jì)域 統(tǒng)計(jì)什么
e.g. 統(tǒng)計(jì)所有男生和女生的年齡之和 db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
$avg 求平均 e.g. 求每個(gè)性別的平均年齡 db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
$max 求最大值 e.g. 求每組年齡的最大值 db.class1.aggregate({$group:{_id:'$sex',max:{$max:'$age'}}})
$min 求最小值
e.g. 求每組年齡的最小值 db.class1.aggregate({$group:{_id:'$sex',min:{$min:'$age'}}})
$project 用于修改文檔的顯示效果
e.g. db.class1.aggregate({$project:{_id:0,sex:0}})
e.g. 指定顯示域名 db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match 過(guò)濾數(shù)據(jù)
e.g. 過(guò)濾年齡大于16的 db.class1.aggregate({$match:{age:{$gt:16}}})
作業(yè) : 熟練mongodb增刪改查操作 熟練 索引操作
第四天
復(fù)習(xí):
\1. 數(shù)據(jù)的修改 update(query,update,upsert,multi)
修改器 : $set $unset $rename $setOnInsert $inc $mul $max $min $push $pushAll $pull $pullAll $each $position $sort $addToSet $pop
時(shí)間類型 : new Date() ISODate() Date() valueOf()
null : 作為一個(gè)域的值,或者表示一個(gè)域不存在
內(nèi)部文檔 :通過(guò) . 獲取內(nèi)部文檔某個(gè)域的值
索引操作: ensureIndex({},{}) dropIndex() dropIndexes() getIndexes()
聚合操作
aggregate()
聚合操作 $group $project $match $sum $avg $max $min **************
聚合操作
$limit 顯示前幾條文檔
e.g. 獲取數(shù)據(jù)的前兩個(gè)文檔 db.class1.aggregate({$limit:2})
$skip 跳過(guò)幾條文檔
e.g. 跳過(guò)前兩條文檔顯示后面內(nèi)容 db.class1.aggregate({$skip:2})
$sort 排序
e.g. 按年齡升序排序 db.class1.aggregate({$sort:{age:1}})
聚合管道 : 將前一個(gè)聚合操作得到的結(jié)果,給后一個(gè)聚合操作繼續(xù)使用
db.collection.aggregate([聚合1,聚合2....])
e.g. $match ---> $project ---> $sort db.class1.aggregate([{$match:{sex:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
e.g. $group ---> $match db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
練習(xí): 增加分?jǐn)?shù)域 score:{chinese:88,math:76,english:76}
1.學(xué)生按照性別分組,統(tǒng)計(jì)每組人數(shù) aggregate({$group:{_id:'$sex',num:{$sum:1}}})
\2. 統(tǒng)計(jì)每名男生的語(yǔ)文分?jǐn)?shù) aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])
\3. 將所有女生按照英語(yǔ)成績(jī)降序排序 aggregate([{$match:{sex:'w'}},{$sort:{'score.englisth':-1}}])
固定集合
mongodb中可以創(chuàng)建大小固定的集合,稱之為固定集合
特點(diǎn) : 插入速度快,順序查找速度快 能夠淘汰早期數(shù)據(jù) 可以控制集合大小
使用 : 臨時(shí)緩存 日志處理
db.createCollection(collection,{capped:true,size:10000,max:1000})
capped:true 表示創(chuàng)建固定集合 size : 表示集合的大小 bytes 4.0最小 4096 max : 表示最多存放多少文檔
e.g. db.createCollection('log',{capped:true,size:10,max:3})
文件存儲(chǔ)
文件存儲(chǔ)到數(shù)據(jù)庫(kù)方式
\1. 存儲(chǔ)路徑 將文件在本地的路徑以字符串形式存儲(chǔ)到數(shù)據(jù)庫(kù)
優(yōu)點(diǎn) : 節(jié)省數(shù)據(jù)庫(kù)空間 缺點(diǎn) : 當(dāng)數(shù)據(jù)庫(kù)或者文件位置發(fā)生變化時(shí)文件丟失。
\2. 存儲(chǔ)文件本身 以二進(jìn)制方式將文件存儲(chǔ)到數(shù)據(jù)庫(kù) 優(yōu)點(diǎn):數(shù)據(jù)庫(kù)和文件綁定存在 缺點(diǎn) : 占用空間大,結(jié)構(gòu)化麻煩
mongodb存儲(chǔ)二進(jìn)制文件
* GridFS方法存儲(chǔ)大文件 >16M為大文件 * 將文件轉(zhuǎn)化為二進(jìn)制,進(jìn)行插入 Binary data
GridFS方案解釋
\1. 在mongodb中一個(gè)數(shù)據(jù)庫(kù)創(chuàng)建兩個(gè)集合共同完成對(duì)文件的存儲(chǔ) \2. fs.files 用來(lái)存儲(chǔ)文件的相關(guān)信息,為每一個(gè)文件創(chuàng)建一個(gè)文檔,存儲(chǔ)文件名、文件類型等信息 \3. fs.chunks 用來(lái)分塊存儲(chǔ)文件的實(shí)際內(nèi)容
如何存儲(chǔ) mongofiles -d dbname put file 數(shù)據(jù)庫(kù) 要存儲(chǔ)的文件
* 如果數(shù)據(jù)庫(kù)不存在自動(dòng)創(chuàng)建
fs.files { "_id" : ObjectId("5b569b8969d72e103282f608"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-07-24T03:22:54.259Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "abc.mp4" }
fs.chunks { "_id" : ObjectId("5b569b8969d72e103282f61d"), "files_id" : ObjectId("5b569b8969d72e103282f608"), "n" : 20, "data" : BinData(0,"7Pa7M7M9nZt2bezsz272vbdm/7fhu672fwAAbZKbmR2S7Ndv/.....")}
* 對(duì)于同一個(gè)文件 fs.files中的_id值等于 fs.chunks中的files_id值
文件提取方法
mongofiles -d dbname get file
Grid的優(yōu)缺點(diǎn) 優(yōu)點(diǎn) : 存儲(chǔ)方便,提供較好的命令支持 缺點(diǎn) : 讀寫(xiě)效率低
游標(biāo)
通過(guò)一定的操作獲取返回結(jié)果的對(duì)象
var cursor = db.class1.find() cursor.hasNext() 判斷是否有next cursor.next() 獲取下一條數(shù)據(jù)
python操作mongodb
pymongo模塊 第三方模塊
安裝 sudo pip3 install pymongo
操作步驟 \1. 創(chuàng)建mongodb數(shù)據(jù)庫(kù)連接對(duì)象
conn = pymongo.MongoClient('localhost',27017)
\2. 得到數(shù)據(jù)庫(kù)對(duì)象
db = conn.stu
\3. 獲取集合對(duì)象
myset = db.class1
\4. 增刪改查,索引 ,聚合
調(diào)用各種myset的屬性函數(shù)
\5. 關(guān)閉數(shù)據(jù)庫(kù)連接 conn.close()
插入操作
insert() insert_many() insert_one() save()
查找操作
cursor = find() 返回一個(gè)結(jié)果游標(biāo)
* 在pymongo中使用操作符的方法與mongo shell中相同,只需要轉(zhuǎn)變?yōu)樽址袷郊由弦?hào)即可
cursor 的屬性函數(shù)
next() limit() skip() sort([('name',1),('age',-1)]) count()
* 使用了next或者for取游標(biāo)后就不能使用limit sort操作了
find_one() 返回一個(gè)字典
更新操作
update(query,updata,upsert=False,multi=False) update_many() update_one()
刪除操作 remove(query,multi = True)
multi默認(rèn)為True表示刪除所有篩選內(nèi)容 如果設(shè)置為False則表示刪除一條
復(fù)合功能函數(shù) find_one_and_delete()
索引操作 ensure_index() 創(chuàng)建索引 list_indexes() 查看索引 drop_index() 刪除索引 drop_indexes() 刪除所有索引
聚合操作 aggregate([]) 參數(shù)寫(xiě)法和mongo shell中聚合相同 返回值 : 返回一個(gè)迭代游標(biāo) 同find()
GridFS 程序提取
import gridfs
gridfs.GridFS(db)
插入二進(jìn)制格式數(shù)據(jù)
import bson.binary
常用命令
> show dbs -- 查看數(shù)據(jù)庫(kù)列表
> use admin --創(chuàng)建admin數(shù)據(jù)庫(kù),如果存在admin數(shù)據(jù)庫(kù)則使用admin數(shù)據(jù)庫(kù)
> db ---顯示當(dāng)前使用的數(shù)據(jù)庫(kù)名稱
> db.getName() ---顯示當(dāng)前使用的數(shù)據(jù)庫(kù)名稱
> db.dropDatabase() --刪當(dāng)前使用的數(shù)據(jù)庫(kù)
> db.repairDatabase() --修復(fù)當(dāng)前數(shù)據(jù)庫(kù)
> db.version() --當(dāng)前數(shù)據(jù)庫(kù)版本
> db.getMongo() --查看當(dāng)前數(shù)據(jù)庫(kù)的鏈接機(jī)器地址
> db.stats() 顯示當(dāng)前數(shù)據(jù)庫(kù)狀態(tài),包含數(shù)據(jù)庫(kù)名稱,集合個(gè)數(shù),當(dāng)前數(shù)據(jù)庫(kù)大小 ...
> db.getCollectionNames() --查看數(shù)據(jù)庫(kù)中有那些個(gè)集合(表)
> show collections --查看數(shù)據(jù)庫(kù)中有那些個(gè)集合(表)
> db.person.drop() --刪除當(dāng)前集合(表)person
MongoDB預(yù)熱,簡(jiǎn)單的增刪改
首先我先介紹一點(diǎn)MongoDB的基本概念
1、MongoDB是NoSQL中面向文檔的數(shù)據(jù)庫(kù),他是介于關(guān)系型數(shù)據(jù)庫(kù)與非數(shù)據(jù)庫(kù)之間的數(shù)據(jù)庫(kù)產(chǎn)品。
2、MongoDB的文檔,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的一行數(shù)據(jù)。
3、多個(gè)文檔組成一個(gè)集合(collection),集合相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的表
4、多個(gè)集合,組合在一起,就是一個(gè)數(shù)據(jù)庫(kù)
5、一個(gè)運(yùn)行的MongoDB Server支持多個(gè)數(shù)據(jù)庫(kù)。
MongoDB中的插入Insert
首先打開(kāi)cmd,輸入Mongo進(jìn)入shell界面
輸入show dbs ,查看當(dāng)前數(shù)據(jù)庫(kù)為local。然后創(chuàng)建數(shù)據(jù)庫(kù),庫(kù)名為fristdb,輸入 use fristdb ,這樣就相當(dāng)于創(chuàng)建啦數(shù)據(jù)庫(kù)。
note:
> db.people.insert({"name":"張龍豪","age",18}) 這一句由于{}里面的內(nèi)容不是json結(jié)構(gòu)的數(shù)據(jù),不能插入數(shù)據(jù)庫(kù)表(集合)people中。
> db.people.insert({"name":"張龍豪","age":18}) 這樣文檔格式?jīng)]有錯(cuò)誤,就插入成功,意思是在fristdb庫(kù)中插入people集合(表),文檔(行數(shù)據(jù))為 {"name":"張龍豪","age":18}
> db.room.insert({"cmp":50,"tree":20}) 這一句又創(chuàng)建啦一個(gè)集合(表)插入文檔(行數(shù)據(jù))為{"cmp":50,"tree":20}
MongoDB中的查看select---find
note:首先我在peple集合中插入啦2條數(shù)據(jù),一條是18歲,一條是20歲。
> db.peple.find() 查出peple集合中的所有的文檔
> db.peple.find({"age":18}) 查出peple集合中年齡為18的一條文檔。
MongoDB中的修改update
Note:這個(gè)看圖,我就不羅嗦啦,update({},{}),前面一個(gè)是查詢條件,后面是修改后的數(shù)據(jù)文檔
MongoDB中的刪除delete--remove
Note:刪除后剩下一條張龍豪20的數(shù)據(jù)
MongoDB高級(jí)查詢?cè)敿?xì)
前言
前幾篇,老玩家繞道即可,新手晚上閑著也是蛋疼,不如把命令敲一邊,這樣你就會(huì)對(duì)MongoDB有一定的掌握啦。如果沒(méi)有安裝MongoDB去看我的上一篇博客 MongoDB下載安裝與簡(jiǎn)單增刪改查
前奏:啟動(dòng)mongdb數(shù)據(jù)庫(kù)服務(wù),并進(jìn)入shell界面
> cmd
> cd C:\Program Files\MongoDB\bin --進(jìn)入mongdb安裝文件的bin目錄下。
> net start mongoDB; --開(kāi)啟mongoDB數(shù)據(jù)庫(kù)服務(wù)
> mongo --進(jìn)入shell界面
首先我先介紹一點(diǎn)MongoDB的基本概念
1、MongoDB是NoSQL中面向文檔的數(shù)據(jù)庫(kù),他是介于關(guān)系型數(shù)據(jù)庫(kù)與非數(shù)據(jù)庫(kù)之間的數(shù)據(jù)庫(kù)產(chǎn)品。
2、MongoDB的文檔,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的一行數(shù)據(jù)。
3、多個(gè)文檔組成一個(gè)集合(collection),集合相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的表
4、多個(gè)集合,組合在一起,就是一個(gè)數(shù)據(jù)庫(kù)
5、一個(gè)運(yùn)行的MongoDB Server支持多個(gè)數(shù)據(jù)庫(kù)。
常用命令
> show dbs -- 查看數(shù)據(jù)庫(kù)列表
> use admin --創(chuàng)建admin數(shù)據(jù)庫(kù),如果存在admin數(shù)據(jù)庫(kù)則使用admin數(shù)據(jù)庫(kù)
> db ---顯示當(dāng)前使用的數(shù)據(jù)庫(kù)名稱
> db.getName() ---顯示當(dāng)前使用的數(shù)據(jù)庫(kù)名稱
> db.dropDatabase() --刪當(dāng)前使用的數(shù)據(jù)庫(kù)
> db.repairDatabase() --修復(fù)當(dāng)前數(shù)據(jù)庫(kù)
> db.version() --當(dāng)前數(shù)據(jù)庫(kù)版本
> db.getMongo() --查看當(dāng)前數(shù)據(jù)庫(kù)的鏈接機(jī)器地址
> db.stats() 顯示當(dāng)前數(shù)據(jù)庫(kù)狀態(tài),包含數(shù)據(jù)庫(kù)名稱,集合個(gè)數(shù),當(dāng)前數(shù)據(jù)庫(kù)大小 ...
> db.getCollectionNames() --查看數(shù)據(jù)庫(kù)中有那些個(gè)集合(表)
> show collections --查看數(shù)據(jù)庫(kù)中有那些個(gè)集合(表)
> db.person.drop() --刪除當(dāng)前集合(表)person
MongoDB接入Javascrip風(fēng)格語(yǔ)法,for,while,next,hasNext,forEach,toArray,findOne,limit
Note:
1、p={name:"張龍豪",age:18} 這個(gè)不是規(guī)范的json格式,使用這種類似javascript語(yǔ)法,對(duì)象會(huì)自動(dòng)補(bǔ)全為規(guī)范的json格式{"name":"張龍豪","age":18}.
2、我在這里插入2條數(shù)據(jù),一條是insert語(yǔ)法,一條是save語(yǔ)法,這里的insert與save是一樣的功能。
Note:這里我主要用啦一個(gè)for語(yǔ)法,循環(huán)插入啦4條數(shù)據(jù),是不是有點(diǎn)小激動(dòng)。哈哈,mongodb就是這么任性。
Note:這里是吧查詢出來(lái)的
1、while:作為程序員應(yīng)該都不陌生他是個(gè)循環(huán)。
2、hasNext: cursor集合遍歷,是否還有數(shù)據(jù)。
3、printjson:輸出集合中的文檔
4、next:當(dāng)前文檔,并向下遍歷。
Note:forEach循環(huán)輸入,必須定義一個(gè)函數(shù)供每個(gè)游標(biāo)元素調(diào)用。
Note:游標(biāo)也可以當(dāng)作數(shù)組來(lái)用。
Note:游標(biāo)轉(zhuǎn)換為真實(shí)的數(shù)組類型,使用。
Note:findOne,返回結(jié)果集中的第一條數(shù)據(jù)。limit(3),返回結(jié)果集中的前三條數(shù)據(jù)。
MongoDB中的高級(jí)查詢
面向文檔的NoSql數(shù)據(jù)庫(kù)重要解決的問(wèn)題不是高性能的并發(fā)讀寫(xiě)問(wèn)題,而是保證海量數(shù)據(jù)存儲(chǔ)的同時(shí),具有比一般數(shù)據(jù)庫(kù)更加良好的查詢性能。
Note:條件操作符號(hào): > 、 < 、 >= 、<=
1、 $gt //大于 > ,$lt //小于 < ,$gte //大于等于 >= ,$lte //小于等于
2、{"filed":{$op,value}} //filed字段 ,$op條件操作符號(hào),value值。
3、{"age":{$gt:1}} : person集合中年齡大于1的所有數(shù)據(jù)文檔
Note:$all匹配所有,類似t-sql中的in,但是t-sql中的in是滿足括號(hào)里面的任何一個(gè)都能出數(shù)據(jù),而mongodb中的$all則必須滿足[]中的所有值。
1、{age:{$all:[7,9]}}:age數(shù)組中只要有7和9就滿足條件。如果只有7,沒(méi)有9則不符合條件。
Note:$exists判斷字段是否存在,(true/false)
1、{city:{$exists:true}}: 集合中存在city這個(gè)字段的數(shù)據(jù)
Note:$mod取模運(yùn)算。
1、{age:{$mod:[7,6]}}:集合中模7余6的數(shù)據(jù)
Note:$ne不等于
Note:$in包含,$nin不包含。跟t-sql中的in,not in一樣。
1、{age:{$in:[10,11]}}:如果age是數(shù)組的話,只要數(shù)組包含in中條件的任何一條數(shù)據(jù),都能被檢索出來(lái)。不是數(shù)組,則只要滿足in中的任何一個(gè)條件數(shù)據(jù),也可以被檢索出來(lái)。
Note:數(shù)組元素個(gè)數(shù)。
1、{age:{$size:4}}:age數(shù)組元素個(gè)數(shù)為4的數(shù)據(jù)結(jié)果集。
Note:$not正則匹配,不包含以張開(kāi)頭的數(shù)據(jù)。
Note:skip,limit,sort,count
1、skip(2):從數(shù)據(jù)集的第二條開(kāi)始查詢
2、limit(2) : 依次查出2條數(shù)據(jù)。
3、sort({age:1}) : 1.正序查詢,-1倒敘查詢。
4、count():結(jié)果集總數(shù)。
分類: MongoDB
參考網(wǎng)站
芒果數(shù)據(jù)庫(kù)基本操作a1264716408的博客-CSDN博客芒果db查詢
MongoDB下載安裝與簡(jiǎn)單增刪改查 - 張龍豪 - 博客園 (cnblogs.com)
MongoDB高級(jí)查詢?cè)敿?xì) - 張龍豪 - 博客園 (cnblogs.com)
MongoDB和java代碼結(jié)合
package com.liujinghe.demo.mongodb; ? import java.net.UnknownHostException; import java.util.Date; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.MongoClient; import com.mongodb.MongoException; ? public class Demo {public static void main(String[] args) { ?try {/**** Connect to MongoDB ****/// Since 2.10.0, uses MongoClient//(MongoClient類的實(shí)例)一個(gè)帶有內(nèi)部連接池的MongoDB客戶端MongoClient mongo = new MongoClient("localhost", 27017); ?/**** Get database ****/// if database doesn't exists, MongoDB will create it for you//創(chuàng)建名為yihaomen的數(shù)據(jù)庫(kù)DB db = mongo.getDB("yihaomen"); ?/**** Get collection / table from 'yihaomen' ****/// if collection doesn't exists, MongoDB will create it for you//創(chuàng)建集合(表)DBCollection table = db.getCollection("crudCollection"); ?/**** Insert ****/// create a document to store key and value//創(chuàng)建BasicDBObject對(duì)象,將代碼對(duì)象轉(zhuǎn)換為json數(shù)據(jù)BasicDBObject document = new BasicDBObject();document.put("name", "yihaomen");document.put("age", 30);document.put("createdDate", new Date());//向芒果db中插入數(shù)據(jù)table.insert(document); ?/**** Find and display ****///創(chuàng)建BasicDBObject對(duì)象,將代碼對(duì)象轉(zhuǎn)換為json數(shù)據(jù)BasicDBObject searchQuery = new BasicDBObject();searchQuery.put("name", "yihaomen"); ?//從芒果db中查詢數(shù)據(jù),返回結(jié)果放入DBCursorDBCursor cursor = table.find(searchQuery);while (cursor.hasNext()) {System.out.println(cursor.next());} ?/**** Update ****/// search document where name="yihaomen" and update it with new values//創(chuàng)建BasicDBObject對(duì)象,將代碼對(duì)象轉(zhuǎn)換為json數(shù)據(jù)//要修改的對(duì)象BasicDBObject query = new BasicDBObject();query.put("name", "yihaomen"); ?//修改后的對(duì)象BasicDBObject newDocument = new BasicDBObject();newDocument.put("name", "yihaomen-updated"); ?//修改條件BasicDBObject updateObj = new BasicDBObject();updateObj.put("$set", newDocument); ?//芒果db修改操作table.update(query, updateObj); ?/**** Find and display ****/BasicDBObject searchQuery2= new BasicDBObject().append("name", "yihaomen-updated"); ?DBCursor cursor2 = table.find(searchQuery2); ?while (cursor2.hasNext()) {System.out.println(cursor2.next());} ?/**** Remove test ****///刪除操作//BasicDBObject delDocument = new BasicDBObject();//newDocument.put("name", "yihaomen-updated");//table.remove(delDocument); ?/**** Done ****/System.out.println("Done");} ? // ? ? ? } catch (UnknownHostException e) { // ? ? ? ? ? e.printStackTrace(); // ? ? ? }catch (MongoException e) {e.printStackTrace();} ?} }總結(jié)
- 上一篇: code1928: 日期差值 技巧模拟
- 下一篇: BZOJ1050 [HAOI2006]旅