MongoDB 基礎入門教學:MongoDB Shell 篇

這裡教大家如何透過 MongoDB shell(mongo)來使用 MongoDB 資料庫。

mongo 是一個用來操作 MongoDB 的互動式 JavaScript 介面,您可以使用它來查詢(query)或更新(update)資料庫中的資料,另外也可以進行一些資料庫的管理動作。


在使用 mongo 之前,請先安裝好 MongoDB 資料庫,安裝方式請參考:

開始使用 mongo

當您安裝好 MongoDB 之後,可以執行 mongo 以 MongoDB Shell 來連線到 MongoDB:

mongo

如果在 Windows 的命令提示字元中,執行的時候要加上 .exe 副檔名,必要時指定其路徑。

如果沒有加上任何參數,mongo 指令預設會連線到 localhost27017 連接埠,如果要改變主機與連接埠,可以參考 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)。

參考資料:MongoDB Shell (mongo)

程式設計

2 Comments

  1. Jason

    Useful!

  2. luk

    thx

Leave a Reply