一、MongoDB 創建資料庫 語法:MongoDB 創建資料庫的語法格式如下: 如果資料庫不存在,則創建資料庫,否則切換到指定資料庫。 如果你想查看所有資料庫,可以使用 show dbs 命令: 可以看到,我們剛創建的資料庫 Hero並不在資料庫的列表中, 要顯示它,我們需要向Hero資料庫插入一 ...
一、MongoDB 創建資料庫
語法:MongoDB 創建資料庫的語法格式如下:
use DATABASE_NAME
如果資料庫不存在,則創建資料庫,否則切換到指定資料庫。
> use Hero switched to db Hero > db Hero >
如果你想查看所有資料庫,可以使用 show dbs 命令:
> show dbs admin 0.000GB config 0.000GB local 0.000GB >
可以看到,我們剛創建的資料庫 Hero並不在資料庫的列表中, 要顯示它,我們需要向Hero資料庫插入一些數據。
> db.Hero.insert({"h_name":"李白","h_skill":"青蓮劍歌"}) WriteResult({ "nInserted" : 1 }) > show dbs Hero 0.000GB admin 0.000GB config 0.000GB local 0.000GB >
MongoDB 中預設的資料庫為 test,如果你沒有創建新的資料庫,集合將存放在 test 資料庫中。
註意: 在 MongoDB 中,集合只有在內容插入後才會創建! 就是說,創建集合(數據表)後要再插入一個文檔(記錄),集合才會真正創建。
二、MongoDB 刪除資料庫
語法:MongoDB 刪除資料庫的語法格式如下:
db.dropDatabase()
刪除當前資料庫,預設為 test,你可以使用 db 命令查看當前資料庫名。
以下我們刪除資料庫Hero為例,首先,查看所有資料庫:
> show dbs
Hero 0.000GB
admin 0.000GB
config 0.000GB
local 0.000GB
>
接下來我們切換到資料庫Hero:
> use Hero
switched to db Hero
>
執行刪除命令:
> db.dropDatabase() { "dropped" : "Hero", "ok" : 1 } >
最後,我們再通過 show dbs 命令資料庫是否刪除成功:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
三、MongoDB 創建集合
MongoDB 中使用 createCollection() 方法來創建集合。語法格式:
db.createCollection(name, options)
參數說明:
- name: 要創建的集合名稱
- options: 可選參數, 指定有關記憶體大小及索引的選項
options 可以是如下參數:
在插入文檔時,MongoDB 首先檢查固定集合的 size 欄位,然後檢查 max 欄位。
實例在Hero資料庫中創建heros集合:
> use Hero switched to db Hero > db.createCollection("heros") { "ok" : 1 } >
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
> show collections heros > show tables heros >
下麵是帶有幾個關鍵參數的 createCollection() 的用法:
創建固定集合my_hero,整個集合空間大小10240KB, 文檔最大個數為 10000 個。
> db.createCollection("my_hero",{capped:true,size:10240,max:10000}) { "ok" : 1 } >
在 MongoDB 中,你不需要創建集合。當你插入一些文檔時,MongoDB 會自動創建集合。
> db.Hero2.insert({"name":"my_hero2"}) WriteResult({ "nInserted" : 1 }) > show collections Hero2 my_hero >
四、MongoDB 刪除集合
MongoDB 中使用 drop() 方法來刪除集合。語法格式:
db.collectionName.drop()
返回值:如果成功刪除選定集合,則 drop() 方法返回 true,否則返回 false。
實例:刪除Hero資料庫中的my_hero集合
> use Hero switched to db Hero > show collections heros my_hero > db.my_hero.drop() true >
驗證
> show collections
heros
五、MongoDB 插入文檔
文檔的數據結構和 JSON 基本一樣。
所有存儲在集合中的數據都是 BSON 格式。
BSON 是一種類似 JSON 的二進位形式的存儲格式,是 Binary JSON 的簡稱。
插入文檔:MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:
db.COLLECTION_NAME.insert(document)
insert()在前面我們已經使用過了,在這裡就不多介紹了,我們看一下save()
> use Hero switched to db Hero > show collections heros > db.heros2.save({x:10}) WriteResult({ "nInserted" : 1 }) > show collections heros heros2
六、MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。
update() 方法:update() 方法用於更新已存在的文檔。語法格式如下:
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,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,拋出異常的級別。
實例:我們在集合heros中插入如下數據:
> db.heros.insert({h_name:"李白",h_skill:"青蓮劍歌"}) WriteResult({ "nInserted" : 1 })
接著我們通過 update() 方法來更新技能:
> db.heros.update({"h_skill":"青蓮劍歌"},{$set:{"h_skill":"神來之筆"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.heros.find() { "_id" : ObjectId("5d2d79034a7e85480a44bddb"), "h_name" : "李白", "h_skill" : "神來之筆" }
save() 方法:save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save( <document>, { writeConcern: <document> } )
參數說明:
- document : 文檔數據。
- writeConcern :可選,拋出異常的級別。
實例:以下實例中我們替換了 _id 為 5d2d79034a7e85480a44bddb 的文檔數據:
> db.heros.save({"_id":ObjectId("5d2d79034a7e85480a44bddb"),"h_name":"韓信","h_skill":"國士無雙"}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.heros.find() { "_id" : ObjectId("5d2d79034a7e85480a44bddb"), "h_name" : "韓信", "h_skill" : "國士無雙" }
七、MongoDB 刪除文檔
MongoDB remove()函數是用來移除集合中的數據。在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
語法:remove() 方法的基本語法格式如下所示:
db.collection.remove( <query>, <justOne> )
如果你的 MongoDB 是 2.6 版本以後的,語法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
參數說明:
- query :(可選)刪除的文檔的條件。
- justOne : (可選)如果設為 true 或 1,則只刪除一個文檔,如果不設置該參數,或使用預設值 false,則刪除所有匹配條件的文檔。
- writeConcern :(可選)拋出異常的級別。
實例:我們把上面修改為韓信的數據刪除
> db.heros.remove({"h_name":"韓信"}) WriteResult({ "nRemoved" : 1 }) > db.heros.find() #查找已經沒有數據了 >
八、MongoDB 查詢文檔
MongoDB 查詢文檔使用 find() 方法。find() 方法以非結構化的方式來顯示所有文檔。
語法:MongoDB 查詢數據的語法格式如下:
db.collection.find(query, projection)
- query :可選,使用查詢操作符指定查詢條件
- projection :可選,使用投影操作符指定返回的鍵。查詢時返迴文檔中所有鍵值, 只需省略該參數即可(預設省略)。
如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法,語法格式如下:
>db.col.find().pretty()
我們先往heros集合中插入兩條數據作為查詢對象
> db.heros.insert({h_name:"李白",h_skill:"青蓮劍歌",h_attack:1000,h_blood:1500}) WriteResult({ "nInserted" : 1 }) > db.heros.insert({h_name:"韓信",h_skill:"國士無雙",h_attack:800,h_blood:1200}) WriteResult({ "nInserted" : 1 }) > db.heros.find() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } > db.heros.find().pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } >
除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
1、比較運算符
- 等於,預設是等於判斷,沒有運算符
- 小於$lt
- 小於或等於$lte
- 大於$gt
- 大於或等於$gte
- 不等於$ne
例如:查詢攻擊力大於800的
> db.heros.find({h_attack:{$gt:800}}).pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } >
查詢攻擊力大於等於800的
> db.heros.find({h_attack:{$gte:800}}).pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 }
2、MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。
語法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
例如:查詢攻擊力大於800,並且血量大於1200的
> db.heros.find({"h_attack":{$gt:800},"h_blood":{$gt:1200}}).pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } >
3、MongoDB OR 條件
MongoDB OR 條件語句使用了關鍵字 $or,語法格式如下:
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
例如:查詢攻擊力大於800或者血量大於1000的
db.heros.find({$or:[{h_attack:{$gt:800}},{h_blood:{$gt:1000}}]}).pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } >
九、MongoDB $type 操作符
$type操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
MongoDB 中可以使用的類型如下表所示:
首先我們在heros裡面插入一條數據其h_name為一個數字
> db.heros.insert({h_name:7,h_skill:6,h_attack:1300,h_blood:900}) WriteResult({ "nInserted" : 1 }) > db.heros.find().pretty() { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } { "_id" : ObjectId("5d2d9e4fa77ffd067ee1ebc8"), "h_name" : 7, "h_skill" : 6, "h_attack" : 1300, "h_blood" : 900 }
然後使用type查詢h_name為字元串類型的
> db.heros.find({h_name:{$type:2}}) { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 }
或者:
> db.heros.find({h_name:{$type:"string"}}) { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1
十、MongoDB Limit與Skip方法
1、MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數量的數據記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
語法:limit()方法基本語法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
例如:我們要查詢heros集合裡面的數據,限制每次查詢兩條
> db.heros.find().limit(2) { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 }
如果沒有指定limit()方法中的參數則顯示集合中的所有數據。
2、MongoDB Skip() 方法
我們除了可以使用limit()方法來讀取指定數量的數據外,還可以使用skip()方法來跳過指定數量的數據,skip方法同樣接受一個數字參數作為跳過的記錄條數。
語法:skip() 方法腳本語法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
例如:查詢每次查詢兩條,跳過第一條查詢
> db.heros.find().limit(2).skip(1) { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } { "_id" : ObjectId("5d2d9e4fa77ffd067ee1ebc8"), "h_name" : 7, "h_skill" : 6, "h_attack" : 1300, "h_blood" : 900 } >
十一、MongoDB sort() 排序方法
在 MongoDB 中使用 sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。
語法:sort()方法基本語法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})
例如:對heros集合的attack欄位按照升序排列
> db.heros.find().sort({"h_attack":1}).pretty() { "_id" : ObjectId("5d2d88a2a77ffd067ee1ebc7"), "h_name" : "韓信", "h_skill" : "國士無雙", "h_attack" : 800, "h_blood" : 1200 } { "_id" : ObjectId("5d2d8887a77ffd067ee1ebc6"), "h_name" : "李白", "h_skill" : "青蓮劍歌", "h_attack" : 1000, "h_blood" : 1500 } { "_id" : ObjectId("5d2d9e4fa77ffd067ee1ebc8"), "h_name" : 7, "h_skill" : 6, "h_attack" : 1300, "h_blood" : 900 } >
十二、投影
- 在查詢到的返回結果中,只選擇必要的欄位,而不是選擇一個文檔的整個欄位
- 如:一個文檔有5個欄位,需要顯示只有3個,投影其中3個欄位即可
- 語法:參數為欄位與值,值為1表示顯示,值為0不顯示
db.集合名稱.find({},{欄位名稱:1,...})
- 對於需要顯示的欄位,設置為1即可,不設置即為不顯示
- 特殊:對於_id列預設是顯示的,如果不顯示需要明確設置為0
例1
> db.heros.find({},{h_name:1}) { "_id" : ObjectId("5d2dfd80614bec7ca468778e"), "h_name" : "李白" } { "_id" : ObjectId("5d2dfd8f614bec7ca468778f"), "h_name" : "韓信" }
例2
> db.heros.find({},{_id:0,h_name:1}) { "h_name" : "李白" } { "h_name" : "韓信" }