1、我們 mongodb 安裝成功后,用上一篇的方法啟動 mongodb服務 然后使用 mongodb shell 來做數據庫的增刪改查
2、創建數據庫
-
語法:
use 數據庫名稱
-
案例:
> use juyou switched to db juyou > show dbs admin 0.000GB config 0.000GB local 0.000GB
這時創建完成過,使用命令查詢數據庫卻沒有我們剛創建的數據庫,這時因為剛創建的數據庫沒有數據,下面我們在數據庫中插入一條數據
> db.juyou.insert({"name":"聚優福利"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
juyou 0.000GB
local 0.000GB
這時就能看到剛剛創建的數據庫了
3、刪除數據庫
-
語法:
db.dropDatabase()
-
案例:
首先我們先查詢一下所有的數據庫
> show dbs admin 0.000GB config 0.000GB juyou 0.000GB local 0.000GB
然后我們可以使用 db 來查看當前的數據庫
> db
juyou
當前鏈接的數據庫就是 juyou,如果不是可以使用 use juyou 命令切換到 juyou 數據庫
> use juyou
switched to db juyou
執行刪除命令
> db.dropDatabase() { "dropped" : "juyou", "ok" : 1 }
然后再我們再查詢一下所有數據庫
> show dbs admin 0.000GB config 0.000GB local 0.000GB
已經成功刪除了
4、創建集合
語法:
db.createCollection(name, options)
- name:集合名稱
- options: 可選參數
-
案例:
創建一個名為 userinfo 的集合
> db.createCollection("userinfo") { "ok" : 1 } > show collections userinfo
創建成功后可以使用 show collections 命令查詢已有集合
5、插入文檔
-
語法:
db.集合名稱.insert(document)
-
案例:
在 juyou 集合下的 userinfo 文檔中插入一條數據
> db.userinfo.insert({name:"郭大爺","sex":"男","age":"不詳"})
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "男", "age" : "不詳" }
插入成功后,可以使用 find() 來查詢剛剛插入的數據,下面會對查詢做詳細的講解,這里不多做解釋
可以看到插入數據后,多了一列 _id 的數據,在文檔中 mongodb 會將 _id 字段自動設置為主鍵,如果不指定mongodb會自動生成
自動生成的 ObjectId 是由時間戳、MachineID(電腦的 mac 地址)、進程ID以及自增計數器組成的,基本上不會重復
> db.userinfo.insert({"_id":1,name:"郭少爺","sex":"男","age":"不詳"})
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "男", "age" : "不詳" }
{ "_id" : 1, "name" : "郭少爺", "sex" : "男", "age" : "不詳" }
也可以在插入數據時指定 _id 值,在之前使用mongodb開發中會指定給 _id 值,使用GUID(全球唯一標識)代替
我們也可以先將要插入的數據定義成變量
> var user = {name:"郭老師",sex:"男",age:"18"}
> db.userinfo.insert(user)
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : ObjectId("5abaf679a3aadbe625070c4f"), "name" : "郭大爺", "sex" : "男", "age" : "不詳" }
{ "_id" : 1, "name" : "郭少爺", "sex" : "男", "age" : "不詳" }
{ "_id" : ObjectId("5abb05afa3aadbe625070c50"), "name" : "郭老師", "sex" : "男", "age" : "18" }
mongodb 在3.2版本后 提供了一次插入多條數據的方法 insertMany() ,我們下面把上面的三條數據刪除,然后試一下一次插入多條數據
> db.userinfo.remove({}) WriteResult({ "nRemoved" : 3 }) > db.userinfo.find()
> var users = [ { _id:1, name:"郭大爺", sex:"男", age:"80" }, { _id:2, name:"郭老師", sex:"男", age:"不詳" }, { _id:3, name:"郭少爺", sex:"男", age:"18" } ] > db.userinfo.insertMany(users) { "acknowledged" : true, "insertedIds" : [ 1, 2, 3 ] } > db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" }
這樣我們可以直接插入一個數組
6、更新文檔
更新文檔有 update() 和 save() 兩個方法,接下來分別介紹
-
update() 語法:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
- query:條件,相當於sql update時where條件
- update: 要更新的內容,類似 sql 的 set 后面的內容
-
案例:
我們先查詢一下,郭老師的年齡是不詳,現在我們根據主鍵_id來把年齡更新成20歲
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.update({"_id":2},{$set:{"age":"20"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "20" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" }
已經成功將郭老師的年齡改成20,然后我們看到在更新命令中又一個 $set 的關鍵詞,這個是更新操作符,接下來我們介紹一下操作符
- $inc:將文檔中的數字字段,增加值。比如個郭老師的年齡增加5歲就可以用這個操作符
- $set:將文檔中的字段,更新為傳入的字段。上面已經演示過了
- $unset:將文檔中的某個字段刪除
- $rename:給字段重命名
- (下面的操作符都是用來操作文檔中類型是數組的字段)
- $push:將傳入的參數追加到,文檔中某個字段中,要追加的字段必須是數組類型
- $addToSet:在文檔某個數組類型的字段中增加值,和上面兩個操作符類似,不過這個操作符在增加值時,數組中不能存在要增加的值
- $pop:刪除文檔數組類型字段中第一個 {$pop:{name:1}} 或者最后一個值 {$pop:{name:-1}}
- $pull:刪除和傳入參數相等的第一個值
- $pullAll:和 $pull 一樣刪除值,$pullAll 可以傳入數組,一次刪除多個值
- 參考文檔:https://blog.csdn.net/u014344668/article/details/52460682
-
save() 語法:
db.collection.save( <document>, { writeConcern: <document> } )
- docment:文檔
-
案例:
先查詢一下所有的用戶,然后把_id為2的用戶年齡改為不詳。save() 方法會根據主鍵_id為條件替換文檔
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "20" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > var user = { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } > db.userinfo.save(user) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" }
-
問題:
save() 方法是以主鍵_id作條件,來替換文檔,如果在傳入的文檔中沒有主鍵_id,會怎么樣?下面我們試一下
> var user = { "name" : "郭老師", "sex" : "男", "age" : "不詳" }
> db.userinfo.save(user)
WriteResult({ "nInserted" : 1 })
> db.userinfo.find()
{ "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" }
{ "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" }
{ "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" }
{ "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "男", "age" : "不詳" }
也可以執行成功,不過沒有更新其中的一個文檔,卻新插入了一條數據
7、查詢文檔
-
語法:
db.collection.find(query, projection)
- query:查詢條件
-
案例:
可以在 find() 方法后面在 pertty() 方法以格式化的方式顯示文檔
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } { "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "男", "age" : "不詳" } > db.userinfo.find().pretty() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } { "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "男", "age" : "不詳" }
mongodb query 條件與 sql where 條件 對比

8、$type 操作符
匹配字段類型
> db.userinfo.find() { "_id" : 1, "age" : 80 } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "age" : 18 } { "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "男", "age" : "不詳" } > db.userinfo.find({"age":{$type:2}}) { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : ObjectId("5abb2f42a3aadbe625070c51"), "name" : "郭老師", "sex" : "男", "age" : "不詳" }
上面我們把字段 age 類型為 String 的文檔查詢出來,下面是 mongodb 中類型和數字的對照表

9、Limit() 方法與 Skip() 方法
-
Limit()
-
語法
db.集合名稱.find().limit(數量)
取集合中指定數量的數據
-
案例
db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.find().limit(2) { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" }
-
Skip()
-
語法
db.集合名稱.find().skip(數量)
在集合中取數據時跳過指定量數據
-
案例
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.find().skip(1) { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" }
這兩個方法配合使用,就可以達到分頁的目的
10、排序
-
語法
>db.collection.find().sort({key:1})
-
key:指定排序列,1代表正序、-1代表倒序
-
案例
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.find().sort({"age":1}) { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } > db.userinfo.find().sort({"age":-1}) { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } >
上面分別是不排序、根據age正序、根據age倒序查詢
11、刪除文檔
-
語法
db.collection.remove( <query>, <justOne> )
- query:刪除的條件
- justOne:如果為 true 或者 1,只刪除滿足條件的第一個文檔
-
案例
> db.userinfo.find() { "_id" : 1, "name" : "郭大爺", "sex" : "男", "age" : "80" } { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.remove({"sex":"男"},true) WriteResult({ "nRemoved" : 1 }) > db.userinfo.find() { "_id" : 2, "name" : "郭老師", "sex" : "男", "age" : "不詳" } { "_id" : 3, "name" : "郭少爺", "sex" : "男", "age" : "18" } > db.userinfo.remove({"sex":"男"}) WriteResult({ "nRemoved" : 2 }) > db.userinfo.find()
>
12、刪除集合
-
語法
db.collection.drop()
-
案例
> show collections userinfo > db.userinfo.drop() true > show collections >
