這裡教大家如何透過 MongoDB shell(mongo
)來使用 MongoDB 資料庫。
mongo
是一個用來操作 MongoDB 的互動式 JavaScript 介面,您可以使用它來查詢(query)或更新(update)資料庫中的資料,另外也可以進行一些資料庫的管理動作。
在使用
mongo
之前,請先安裝好 MongoDB 資料庫,安裝方式請參考:
- Windows:在 Windows 中安裝 MongoDB 資料庫
- Ubuntu Linux:在 Ubuntu Linux 中安裝 MongoDB 資料庫
- Mac OS X:在 Mac OS X 中安裝 MongoDB 資料庫
開始使用 mongo
當您安裝好 MongoDB 之後,可以執行 mongo
以 MongoDB Shell 來連線到 MongoDB:
mongo
如果在 Windows 的命令提示字元中,執行的時候要加上 .exe
副檔名,必要時指定其路徑。
如果沒有加上任何參數,mongo
指令預設會連線到 localhost
的 27017
連接埠,如果要改變主機與連接埠,可以參考 mongo Shell Reference Page。
在 MongoDB Shell 環境中,都是以指令來進行操作的,操作的方式跟一般的 shell 類似,您可以在輸入一補份的指令名稱之後,使用 tab
鍵來補齊,或是使用上下鍵來查看之前執行過的指令歷史紀錄,這樣可以加快操作的速度。
一開始進入 MongoDB Shell 時,可以執行 help
來查看基本的操作說明:
help
輸入資料
這張表列出了傳統 SQL 與 MongoDB 的概念性對應關係:
SQL | MongoDB |
---|---|
database | database |
table | collection |
row | document |
column | field |
在輸入資料之前,先使用 use
選擇 database:
use test
然後用 insert
指令將一些資料輸入到 restaurants
這個 collection:
db.restaurants.insert( { "address" : { "street" : "2 Avenue", "zipcode" : "10075", "building" : "1480", "coord" : [ -73.9557413, 40.7720266 ], }, "borough" : "Manhattan", "cuisine" : "Italian", "grades" : [ { "date" : ISODate("2014-10-01T00:00:00Z"), "grade" : "A", "score" : 11 }, { "date" : ISODate("2014-01-16T00:00:00Z"), "grade" : "B", "score" : 17 } ], "name" : "Vella", "restaurant_id" : "41704620" } )
在執行這個動作時,如果遇到 collection 不存在的狀況,MongoDB 會自動建立這個 collection。在執行之後,會傳回一個 WriteResult
物件:
WriteResult({ "nInserted" : 1 })
其中 nInserted
的值就是輸入資料的筆數。
在 MongoDB 中,所有儲存在 collection 中的 document 都會有一個 _id
field 作為 primary key,如果輸入資料時沒有加上這個 field,MongoDB 會自動產生一個 ObjectId 作為 _id
。
查詢資料
若要查詢資料,可以使用 find
方法,當然在查詢之前記得要先指定 database(如果之前已經有指定過就不用了):
use test
直接執行 find
不加任何查詢條件,就會列出該 collection 中所有的 documents:
db.restaurants.find()
查詢的結果會像這樣:
{ "_id" : ObjectId("55b5de22bdc78b2145bd6e32"), "address" : { "street" : "2 Avenue", "zipcode" : "10075", "building" : "1480", "coord" : [ -73.9557413, 40.7720266 ] }, "borough" : "Manhattan", "cuisine" : "Italian", "grades" : [ { "date" : ISODate("2014-10-01T00:00:00Z"), "grade" : "A", "score" : 11 }, { "date" : ISODate("2014-01-16T00:00:00Z"), "grade" : "B", "score" : 17 } ], "name" : "Vella", "restaurant_id" : "41704620" }
指定查詢條件
加入查詢條件:
db.restaurants.find( { "borough": "Manhattan" } )
使用句點(.
)對 embedded document 加上查詢條件:
db.restaurants.find( { "address.zipcode": "10075" } )
句點(.
)也可以用於查詢陣列中的 field 值,這裡的 grades
是一個陣列,裡面包含許多 embedded documents,以這樣的查詢方式的話,只要有任一個 embedded document 符合條件,就會列出該 document:
db.restaurants.find( { "grades.grade": "B" } )
以運算子指定查詢條件
MongoDB 提供了一系列的運算子,讓使用者可以運用在資料的查詢上,使用運算子的限制條件語法為:
{ <field>: { <operator>: <value> } }
其中 <operator>
就是指定的運算子,我們直接來看一些例子會比較容易了解。
如果要查詢 grades.score
大於 30
的 documents,則可使用 $gt
運算子:
db.restaurants.find( { "grades.score": { $gt: 30 } } )
查詢 grades.score
小於 10
的 documents,則使用 $lt
運算子:
db.restaurants.find( { "grades.score": { $lt: 10 } } )
除了這些,MongoDB 還有許多其他的運算子可以使用,請參考 Query and Projection Operators。
使用多個條件
如果同時使用多個查詢條件,可以直接用逗號分開:
db.restaurants.find( { "cuisine": "Italian", "address.zipcode": "10075" } )
這樣的效果就等於 and 運算。而如果要使用 or 運算,則可使用 $or
運算子:
db.restaurants.find( { $or: [ { "cuisine": "Italian" }, { "address.zipcode": "10075" } ] } )
排序查詢結果
如果要讓查詢的結果依照 field 來排序,可以加上 sort
方法,並且指定排序的 field 名稱與排列方式,1
代表遞增,-1
代表遞減。例如:
db.restaurants.find().sort( { "borough": 1, "address.zipcode": 1 } )
這個查詢指令會傳回 restaurants
中所有的 documents,然後以 borough
的值做遞增排序,在 borough
相同的時候,就以 address.zipcode
做遞增排序。
列出所有的 collections
若要列出 database 所有的 collections,可以使用以下幾種方式:
show collections show tables db.getCollectionNames()
資料庫系統資訊
若要查詢整個 MongoDB 中所儲存的資料量大小等系統資訊,可以使用 db.stats
:
db.stats()
{ "db" : "test", "collections" : 5, "objects" : 344697, "avgObjSize" : 10701.451500883384, "dataSize" : 3688758228, "storageSize" : 4248158208, "numExtents" : 35, "indexes" : 4, "indexSize" : 41885648, "fileSize" : 8519680000, "nsSizeMB" : 16, "dataFileVersion" : { "major" : 4, "minor" : 5 }, "ok" : 1 }
其中 dataSize
就是所有未壓縮原始資料的大小,storageSize
是分配給 collections 的空間大小,而 fileSize
則是資料實際儲存在硬碟中時所使用到的空間大小,單位都是位元組(bytes)。
Jason
Useful!
luk
thx
osk2
寫的很清楚,新手入門看這篇就懂啦
wendyliu
請問如何向Mongo租用空間?
我原本使用免費的500M空間,用滿後就無法再上傳資料,想租用空間,卻找不到可以租用的路徑,可以教教我嗎?
我非程式設計者,對相關資訊不是很了解
bill
推!