NoSQL數據庫一MongoDB基本使用

如今的網站對數據存儲要求越來越靈活,在這種需求下 NoSQL 也就是非關係數據庫越來越流行。所謂非關係數據庫,是指不使用 SQL 語言進行數據操作的數據庫的統稱。這類數據庫存儲數據時沒有固定的模式,不支持數據表 join 的操作,可以很方便的進行橫向擴展。非關係數據庫種類很多,其中 MongoDB 和 Redis 應用廣泛。

一、MongoDB介紹

MongoDB 是一個是一個基於分佈式文件存儲的數據庫,介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

二、安裝MongoDB

MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進行安裝。
打開終端,輸入以下命令:
sudo apt-get install mongodb
安裝完成後,在終端輸入以下命令查看MongoDB版本:
mongo -version
輸出版本信息,表明安裝成功

啓動和關閉mongodb命令如下:

service mongodb start
service mongodb stop

默認設置MongoDB是隨Ubuntu啓動自動啓動的。
輸入以下命令查看是否啓動成功:
pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯數字1

卸載MongoDB
sudo apt-get --purge remove mongodb mongodb-clients mongodb-server

三、使用MongoDB

shell命令模式
輸入mongo進入shell命令模式,默認連接的數據庫是test數據庫,在此之前一定要確保你已經啓動了MongoDB,否則會出現錯誤,啓動之後運行成功,如下截圖:
NoSQL數據庫一MongoDB基本使用
MongoDB 存儲的文檔記錄是一個 BSON 對象,類似於 JSON 對象,由鍵值對組成。比如一條用戶記錄:

{
    name: "Aiden",
    age: 30,
    email: "[email protected]"
}

每一個文檔都有一個 id 字段,該字段是主鍵,用於唯一的確定一條記錄。如果往 MongoDB 中插入數據時沒有指定 id 字段,那麼會自動產生一個 id 字段,該字段的類型是 ObjectId,長度是 12 個字節。在 MongoDB 文檔的字段支持字符串,數字,時間戳等類型。一個文檔最大可以達到 16M, 可以存儲相當多的數據。

常用操作命令:
數據庫相關

  • show dbs:顯示數據庫列表
  • show collections:顯示當前數據庫中的集合(類似關係數據庫中的表table)
  • show users:顯示所有用戶
  • use yourDB:切換當前數據庫至yourDB
  • db.help() :顯示數據庫操作命令
  • db.yourCollection.help() :顯示集合操作命令,yourCollection是集合名

先嚐試往 MongoDB 中插入一條數據:

$ mongo
> use shiyanlou
> db.user.insertOne({name: "Aiden", age: 30, email: "[email protected]", addr: ["CD", "SH"]})
{
        "acknowledged" : true,
        "insertedId" : ObjectId("59a8034064e0acb13483d512")
}
> show databases;
admin      0.000GB
local      0.000GB
shiyanlou  0.000GB
> show collections;
user

可以看到,在插入數據前使用 use 指令,切換到了 shiyanlou 數據庫,儘管該數據庫暫時不存在,但當我們插入數據後,該數據庫就被自動創建了。show databases 和 show collection 分別顯示了當前存在的數據庫和當前數據庫的所有文檔集合。而且數據插入後,自動添加了 id 字段。插入多條數據,可以使用 db.collection.insertMany 方法:

> db.user.insertMany([
... {name: "lxttx", age: 28, email: "[email protected]", addr: ["BJ", "CD"]},
... {name: "jin", age: 31, email: "[email protected]", addr: ["GZ", "SZ"]},
... {name: "nan", age: 26, email: "[email protected]", addr: ["NJ", "AH"]}
... ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("59a8034564e0acb13483d513"),
                ObjectId("59a8034564e0acb13483d514"),
                ObjectId("59a8034564e0acb13483d515")
        ]
}

添加的數據其結構是鬆散的,只要是bson格式均可,列屬性均不固定,根據添加的數據爲準。先定義數據再插入,就可以一次性插入多條數據,運行完以上例子,庫自動創建,這也說明 MongoDB 不需要預先定義 collection ,在第一次插入數據後,collection 會自動的創建。

查詢數據可以使用 db.collection.find 方法,可以指定查詢過濾條件:

> db.user.find()
{ "_id" : ObjectId("59a8034064e0acb13483d512"), "name" : "Aiden", "age" : 30, "email" : "[email protected]", "addr" : [ "CD", "SH" ] }
{ "_id" : ObjectId("59a8034564e0acb13483d513"), "name" : "lxttx", "age" : 28, "email" : "[email protected]", "addr" : [ "BJ", "CD" ] }
{ "_id" : ObjectId("59a8034564e0acb13483d514"), "name" : "jin", "age" : 31, "email" : "[email protected]", "addr" : [ "GZ", "SZ" ] }
{ "_id" : ObjectId("59a8034564e0acb13483d515"), "name" : "nan", "age" : 26, "email" : "[email protected]", "addr" : [ "NJ", "AH" ] }

> db.user.find({name: "jin"})
{ "_id" : ObjectId("59a8034564e0acb13483d514"), "name" : "jin", "age" : 31, "email" : "[email protected]", "addr" : [ "GZ", "SZ" ] }

> db.user.find({age: {$gt: 30}})
{ "_id" : ObjectId("59a8034564e0acb13483d514"), "name" : "jin", "age" : 31, "email" : "[email protected]", "addr" : [ "GZ", "SZ" ] }

> db.user.find({addr: "CD"})
{ "_id" : ObjectId("59a8034064e0acb13483d512"), "name" : "Aiden", "age" : 30, "email" : "[email protected]", "addr" : [ "CD", "SH" ] }
{ "_id" : ObjectId("59a8034564e0acb13483d513"), "name" : "lxttx", "age" : 28, "email" : "[email protected]", "addr" : [ "BJ", "CD" ] }

上面例子中,我們先通過 db.user.find() 獲取到了之前插入的全部數據。接着使用不同的過濾條件進行了查詢,其中有一些查詢如 {age: {$gt: 30}} 表示查詢年齡大於 30 的用戶。還可以發現查詢數組中是否存在某一元素也非常方便,上面的例子中查詢出了所有地址含有 CD 用戶。

MongoDB 的查詢功能非常強大,可以組合各種查詢條件,更多的使用方法可以學習實驗樓的其他課程。更新數據主要通過 db.user.updateOne 或者 db.user.updateMany 方法,前者更新一條記錄,後者更新多條記錄:

> db.user.updateOne(
... {name: "Aiden"},
... {$set: {age: 29, addr: ["CD", "SH", "BJ"]}}
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.user.find({name: "Aiden"})
{ "_id" : ObjectId("59a8034064e0acb13483d512"), "name" : "Aiden", "age" : 29, "email" : "[email protected]", "addr" : [ "CD", "SH", "BJ" ] }

可以看到成功的更新了一條記錄。刪除數據也非常簡單,可以通過 db.user.deleteMany 或db.user.deleteOne 方法:

> db.user.deleteMany({addr: "CD"})
{ "acknowledged" : true, "deletedCount" : 2 }
> db.user.find()
{ "_id" : ObjectId("59a8034564e0acb13483d514"), "user" : "jin", "age" : 31, "email" : "[email protected]", "addr" : [ "GZ", "SZ" ] }
{ "_id" : ObjectId("59a8034564e0acb13483d515"), "user" : "nan", "age" : 26, "email" : "[email protected]", "addr" : [ "NJ", "AH" ] }

上面的命令成功的刪除所有地址包含 "CD" 的用戶,共刪除了兩條記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章