MongoDB的使用
MongoDB的搭建
- 成功運行
- 將mongoDB設置為windows服務
- 將mongoDB的端口進行修改為8888
MongoDB的簡單理解
- database 數(shù)據(jù)庫
- collection(表)集合
- document(記錄) 文檔
- field (字段) 域
- index 索引
- 文檔化存儲,和json很像
MongoDB數(shù)據(jù)庫里的增刪改查操作
大致的脈絡如下:
- 數(shù)據(jù)庫的增刪
- 集合的增刪
- 文檔的增刪改查
新建數(shù)據(jù)庫
use 加數(shù)據(jù)庫名 ,例如
use game
db (可以用來查看當前的數(shù)據(jù)庫名稱)
注意:新建數(shù)據(jù)庫后,是不會直接顯示出來的,必須要等插入文檔(記錄)后
簡單插入用例:
db.game.insert({"name":"R","age":"22"})
特別注意:db后面的為collection(集合【表】),如果不存在,會自動新建一個集合,和db緊跟的參數(shù)一致的單詞名
查看所有數(shù)據(jù)庫
show dbs
刪除數(shù)據(jù)庫
進入要刪除數(shù)據(jù)庫文檔,再命令行中輸入
db.dropDatabase()
要刪除前后,可以show dbs 來進行對比
刪除之前,可以通過 db 命令來確認是否是要刪除的數(shù)據(jù)庫
例如:刪除db數(shù)據(jù)庫sg
use sg
db.dropDatabase()
擴展:刪除集合(表)
刪除記錄,首先應該要在該文檔數(shù)據(jù)庫的目錄下
例如:在數(shù)據(jù)庫ab下有一個集合 (表)sfa,需要刪除
use ab
db.sfa.drop()
創(chuàng)建集合(表)
db.createCollection(name,options)
options 包含四個參數(shù)
- capped 設為true時,則集合為固定集合,且options必須同時包含size參數(shù)
- autoIndexId 為自動索引_id字段
- size 為固定集合設置內存大小
- max 為固定集合設置文檔的最大數(shù)量 (若超過了文檔的最大數(shù)量則會進行覆蓋,從最早的文檔開始)
實例:在db fan下新建一個普通collection fans
use fan
db.createCollection("fans")
實例:在db fan 下新建一個size為8888,最大document為6666,且自動在id上建立索引的固定collection superFans
use fan
db.createCollection("superFans",{capped:true,autoIndexId:true,size:8888,max:6666})
特別注意:固定文檔是不能刪除的
插入文檔
db.collection_name.insert(document)
首先要選擇要進行插入記錄的表,即要正確選擇插入文檔的集合
文檔的格式有點像json一樣,插入文檔必須使用{}來進行,有兩種方式
第一種:直接在{}中進行編輯
例如:在數(shù)據(jù)庫ab下的集合fans中插入name為R,age為22的文檔
use ab
db.fans.insert({name:"R",age:22})
第二種:定義一個變量,然后再執(zhí)行插入這個變量
例如 在數(shù)據(jù)庫ab下的集合fans中插入name為W,age為22的文檔(記錄),注意,不需要{}了,只需要???()加入變量
use ab
w=({name:"W",age:22})
db.fans.insert(w)
擴展:插入多條文檔,也是用定義變量來書寫,但是必須要寫在[]里,文檔之間用,進行分割
例如:在fans 中插入name為 a,age為1,name為b,age為2的兩條文檔
var s=db.fans.insertMany([{name:"a",age:1},{name:"b",age:2}])
s
特別注意:insertOne和insertMany方法用變量來進行插入文檔,則必須在變量前加var,而且在書寫完成后再輸一次變量
查看集合中的文檔
db.collection_name.find()
例如:查看在集合fans中的所有文檔
db.fans.find()
更新集合中的文檔
有兩種方式來進行更新
第一種:使用 db.collcetion_name.update({query},{$set:{更新內容}},{可選})
解析:query為條件,相當于一般數(shù)據(jù)庫中的where
可選:
upsert:true時,假如不存在文檔,則插入該更新內容
multi:true時,符合更新條件,則多個文檔進行更新
writeConcern:拋出異常的級別
- WriteConcern.NONE:沒有異常拋出
- WriteConcern.NORMAL:僅拋出網(wǎng)絡錯誤異常,沒有服務器錯誤異常
- WriteConcern.SAFE:拋出網(wǎng)絡錯誤異常、服務器錯誤異常;并等待服務器完成寫操作。
- WriteConcern.MAJORITY: 拋出網(wǎng)絡錯誤異常、服務器錯誤異常;并等待一個主服務器完成寫操作。
- WriteConcern.FSYNC_SAFE: 拋出網(wǎng)絡錯誤異常、服務器錯誤異常;寫操作等待服務器將數(shù)據(jù)刷新到磁盤。
- WriteConcern.JOURNAL_SAFE:拋出網(wǎng)絡錯誤異常、服務器錯誤異常;寫操作等待服務器提交到磁盤的日志文件。
- WriteConcern.REPLICAS_SAFE:拋出網(wǎng)絡錯誤異常、服務器錯誤異常;等待至少2臺服務器完成寫操作。
特別注意,該參數(shù)是沒有{}的,直接跟在第二{}后面,用,隔開
例如:在數(shù)據(jù)庫ab中的集合fans下更新name為w的文檔,需要更新其age為21
use ab
db.fans.update({name:"w"},{$set:{age:21}})
如果有多條文檔需要更新,如下
db.fans.update({name:"w:},{$set:{age:21}},{multi:true})
如果想拋出異常的級別
db.fans.update({name:"w:},{$set:{age:21}},WriteConcern.SAFE)
如果沒有這個文檔,想實現(xiàn)這個更新內容
db.fans.update({name:"w:},{$set:{age:21}},{update:true})
第二種:使用db.collection_name.save(更新【記錄】文檔),用新的文檔來替換原先的文檔
例如:在數(shù)據(jù)庫ab中的集合fans下更新name為w的文檔,需要更新其age為21
db.fans.save({name:"w"},{age:21})
更多實例:
{$gt :2} 表示大于2的數(shù)值
$inc:{age:2} 表示對一個數(shù)值字段(field)增加值
后面跟的兩個參數(shù) 為 upsert ,multi
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條:
db.col.update( { "count" : { $gt: 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加進去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : {$gt: 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
擴展:
更新文檔也可以不用multi來進行更新多條記錄
db.collection_name.updateMany()
例如:在db :ab 中 collection:fans ,更新所有age>22的文檔,設置df為sdf
db.fans.updateMany({"age":{$gt:22}},{$set:{df:"sdf"}})
更新單條記錄
db.collection_name.updateOne()
例如:在db:ab中collection:fans,更新name為sdf,設置age為22
db.fans.updateOne({name:"sdf"},{$set:{age:22}})
刪除文檔
db.collection_name.remove({query},{justOne:<boolen>},writeConcern)
注意沒有justOne修飾的話,則刪除符合條件的多條文檔(記錄)
特別注意:應該要刪除collection所有的數(shù)據(jù)時,應該使用db.collection_name.remove({})
例如在db:ab ,collection:fans ,刪除name:W的多條文檔
db.fans.remove({name:"W"})
例如在db:ab ,collection:fans ,刪除name:W的一條文檔
db.fans.remove({name:"W"},{justOne:true})
還有其他一種方式
db.fans.remove({name:"W"},1)
如果想輸出異常級別的話,可以這樣子添加
db.fans.remove({name:"W"},1,WriteConcern.NONE)
或者這樣
db.fans.remove({name:"W"},{justOne:true},WriteConcern.NONE)
擴展:
mongoDB在新版中有添加了這些刪除的方法,使用這些方法的好處是可以省略justOne的參數(shù)來刪除指定條數(shù)
db.collection_name.deleteOne()
例如:db:ab collection:fans 刪除一條name:fa的文檔 并輸出異常級別為NONE
db.fans.delectOne({name:"fa"},WriteConcern.NONE)
db.collection_name.deleteMany()
例如:db:ab collection:fans 刪除多條name:ck的文檔 并輸出異常級別為NONE
db.fans.delectMany({name:"ck"},WriteConcern.NONE)
查找文檔(記錄)
db.collection_name.find(query,projection).qretty()
注意:projection包含兩種顯示方式
當字段為1時只返回該字段,其他字段不顯示,為inclusion模式 中譯:包含
當字段為0時不返回該字段,其他字段都顯示,為exclusion模式 中譯:排除
特別注意,要么都為1,要么都為0,不然會混淆
顯示錯誤:Projection cannot have a mix of inclusion and exclusion
.qretty()方法為格式化返回的所有文檔
query中的幾個符號
運算符 mongodb中的符號 例如
= : 年齡為1 {age:1}
$gt 年齡>1 {age:{$gt:1}}
= $gte 年齡>=1 {age:{$gte:1}}
< $lt 年齡<1 {age:{$lt:1}}
<= $lte 年齡<=1 {age:{$lte:1}}
!= $ne 年齡!=1 {age:{$ne:1}
特別注意:混合使用
例如:db:ab collection:fans 對年齡>18,年齡<25進行查詢文檔
db.fans.find({age:{$gt:18,$lt:25}}).pretty()
query中的兩個關系 AND和OR
關系 mongodb中使用 例如
and , 查詢年齡為1,名字為w {name:"w",age:1}
or $or 查詢年齡為1,或者名字為w { $or:[ {name:"w"},{age:1} ] }
and和or一起使用 , $or 查詢年齡為1,或者名字為w,并且身高為100 {high:100,$or:[{name:"w"},{age:1}]}
特別注意:可以最好在查詢語句后面加上.pretty()方法
返回指定數(shù)據(jù)類型的文檔
mongoDB中的常用數(shù)據(jù)類型以及其數(shù)字
數(shù)據(jù)類型 數(shù)字 實例
Double 1 返回書籍價格為double類型的文檔 {price:{$type:1}}
String 2 返回書籍名為String類型的文檔{bookName:{$type:2}}
Object 3
Array 4
Binary data 5
Object id 7
Boolean 8 返回登錄狀態(tài)為Boolean類型的文檔{static:{$type:8}}
Date 9 返回時間為Date類型的文檔{time:{$type:9}}
Null 10 返回時間為Null類型的文檔{time:{$type:10}}
32-bit integer 16
Timestamp 17
64-bit integer 18
返回查詢文檔的條數(shù)使用 .limit()方法
db.collection_name.find(query,projection).pretty().limit(數(shù)字參數(shù))
或者
db.collection_name.find(query,projection).limit(數(shù)字參數(shù))
例如: db:ab collection:fans 查詢 age>20 返回2條文檔
db.fans.find({age:{$gt:20}}).pretty().limit(2)
擴展:
使用skip()方法 來跳過限定條數(shù)的返回結果條數(shù)
db.collection_name.find(query,projection).pretty().limit(條數(shù)).skip(條數(shù))
skip中默認參數(shù)為0
例如:db:ab collection:fans 查詢age>20 返回2條文檔,跳過第1條返回結果,只顯示第2條
db.fans.find({age:{$gt:20}}).pretty().limit(2).skip
對查詢文檔指定域(字段)進行排序
db.collection_name.find(query,projection).pretty().sort({字段:1或-1})
解析:1為升序排列,-1為降序排列
在skip(),limit(),sort()三個方法放在一起時,順序為:
sort()
skip()
-
limit()
例如:db:ab collection:fans 查詢age>=22,限制條數(shù)為5,跳過前2條返回結果,并按age進行升序排序
db.fans.find({age:{$gte:22}}).pretty().sort({age:1}).skip(2).limit(5)
創(chuàng)建索引
db.collection_name.ensureIndex({字段:1或-1})
解析:以指定字段創(chuàng)建索引,1為升序排列,-1為降序排列
例如:db:ab collection : fans 以name為指定字段升序排列
db.fans.ensureIndex({name:1})
擴展:
創(chuàng)建復合索引
db.collection_name.ensureIndex({字段1:1或-1,字段2:1或-1})
例如:db:ab collection:fans 以name為指定字段升序排列,age為指定字段降序排列
db.fans.ensureIndex({name:1,age:-1})
ensureIndex接受可選參數(shù)
參數(shù) 類型 描述 實例
background boolean 在后臺進行索引創(chuàng)建 對name創(chuàng)建后臺升序索引db.fans.ensureIndex({name:1},{background:true})
unqiue boolean 創(chuàng)建索引是否為唯一 對name創(chuàng)建升序唯一索引db.fans.ensureIndex({name:1},{unqiue:true})
name String 對索引進行命名 對name創(chuàng)建降序名為AllName索引db.fans.ensureIndex({name:-1},{name:"AllName"})
dropDups boolean 在創(chuàng)建唯一索引時刪除重復記錄 對name創(chuàng)建刪除重復記錄唯一的降序索引db.fans.ensureIndex({name:-1},{unique:true},{dropDups:true})
sparse boolean 對不存在字段不創(chuàng)建索引 對name創(chuàng)建唯一的降序索引對不存在字段不創(chuàng)建(質只允許一個為空)db.fans.ensureIndex({name:-1},{unique:true},{sparse:true})
問題有待于解決:
mongoDB存儲文檔時是不是必須要有一個字符串,或者說是不是字段是否需要"",省略可不可以
mongoDB 中showtables 和 showcollections有沒有區(qū)別
db.fans.remove({name:"fa"},{{justOne:true},writeConcern.SAFE})正確嗎?或者說如何在remove中輸出異常級別?
這句話有錯,語法沒有錯誤,括號有錯,writeConcern應該在括號外,而且還有單詞拼寫錯誤,writeConcern應該首字母大寫,WriteConcern
正確輸出異常級別的語句:db.fans.remove({name:"fa"},{justOne:true},WriteConcern.SAFE)