1. 程式人生 > 其它 >MongoDB入門實戰教程(4)

MongoDB入門實戰教程(4)

通過前面幾篇的鋪墊,我們基本瞭解了MongoDB是個什麼東西,搭建起了一個MongoDB的小叢集環境。接下來,我們就來學習一下MongoDB的基本操作。

1 insert操作

我們都知道對於傳統關係型資料庫,通常會使用SQL來進行基本操作。而對於MongoDB來說,通常則會使用MQL來進行基本操作。

首先,我們來看看如何插入新資料,MongoDB為我們提供了插入單個和多個文件的介面。

插入單個文件:db.<collectionName>.insertOne

db.teams.insertOne({name:"cscec-football-team", members:22});

插入多個文件:db.<collectionName>.insertMany

db.teams.insertMany([
  {name:"yzw-football-team", members:22},
  {name:"yzw-basktellball-team", members:15},
  {name:"yzw-outting-team", members:30}
  ]);

2 find操作

查詢操作(find)初步

在關係型資料庫中,我們最常用的操作就是select,對於MongoDB則是find。需要注意的是,find返回的是遊標。

查詢所有資料:db.<collectionName>.find

db.teams.find(); -- 未格式化
db.teams.
find().pretty(); -- 格式化

如果你使用的是navicat,可以切換一下展現形式看看。

查詢帶條件的資料:db.<collectionName>.find(filter)

-- 單個條件
db.teams.find({"members":22});
-- 多個條件的and(類似於SQL中的and)
db.teams.find({"members":22, "name":"yzw-football-team"});
-- 上面也等價於
db.teams.find({$and:[{"members":22, "name":"yzw-football-team"}]});
-- 多個條件的or(類似於SQL中的or) db.teams.find({$or:[{"members":22, "name":"yzw-football-team"}]}); -- 按照正則表示式查詢 db.teams.find({"name":/^ball/});

查詢操作(find)進階搜尋

在MQL中,傳統SQL中的查詢條件如>, <, !=等操作符有了不一樣的表述:

-- 找到人數>20的team
db.teams.find({"members":{$gt:20}});
-- 找到人數<20的team
db.teams.find({"members":{$lt:20}});
-- 找到人數>=20的team
db.teams.find({"members":{$gte:20}});
-- 找到人數<=20的team
db.teams.find({"members":{$lte:20}});
-- 找到人數!=20的team
db.teams.find({"members":{$ne:20}});

下面是查詢條件的一個對照表:

如果需要查詢某個欄位是NULL?又或者如何實現SQL中的IN呢?

-- name IS NULL
db.teams.find({"name":{$exists:false}});
-- name IS NOT NULL
db.teams.find({"name":{$exists:true}});
-- members IN(11,22,30)
db.teams.find({"members":{$in:[11,22,30]}});
-- members NOT IN(11,22,30)
db.teams.find({"members":{$nin:[11,22,30]}});

下面是查詢邏輯的一個對照表:

查詢操作(find)子文件搜尋

在MQL中,可以支援我們使用"欄位.子欄位名"的形式來查詢子文件:

-- 填充測試資料
db.products.insertOne({name:"YZ.JC", description:{country:"China", province:"Chengdu"}});
-- 查詢子文件
db.products.find({"description.country":"China"});

查詢操作(find)陣列搜尋

在MQL中,可以支援我們搜尋陣列中的元素:

-- 填充資料
db.products.insertMany([
  {name:"Walkman", color:["white","gray"]},
  {name:"CD Player", color:["black","yellow"]}
  ]);
-- 查詢color為white的
db.products.find({color:"white"});
-- 查詢color為white或者black的
db.products.find({$or:[{color:"white"},{color:"black"}]});

在MQL中,也可以支援我們搜尋陣列中的物件:

-- 填充資料
db.games.insertOne({
  "title":"Winning Eleven 2021",
  "versions":[
    {"language":"English", "code":"US", "market":"NorthAmerica"},
    {"language":"Chinese", "code":"CN", "market":"China"},
    {"language":"Japanese", "code":"JP", "market":"Japan"}
  ]
});
-- 搜尋子物件的market是Japan的
db.games.find({"versions.market":"Japan"});
-- 搜尋子物件的market是China且code是CN的
db.games.find({"versions.market":"China","versions.code":"CN"});
-- 使用elemMatch:必須同一個子物件滿足多個條件
db.games.find({"versions":{$elemMatch:{"market":"China","code":"CN"}}});

查詢操作(find)控制返回欄位

在MQL中,find操作可以指定只返回指定的欄位,即所謂的投影操作(projection),需要注意的是:_id欄位必須明確指明不返回,否則預設會返回。操作例項如下:

-- 指明不返回_id,且只返回name欄位
db.teams.find({"members":{$gte:10}},{"_id":0, name:1});
-- 不指明是否返回_id則預設返回,且只返回name欄位
db.teams.find({"members":{$gte:10}},{name:1});
-- 它其實等價於
db.teams.find({"members":{$gte:10}},{"_id":1, name:1});

3 update操作

在MQL中,update操作的格式為:db.<collectionName>.update。

假設這裡要實現更新yzw-football-team的members為22人:

db.teams.updateOne({name:"yzw-football-team"},{"$set":{members:29}});

需要注意的是:使用 updateOne 無論條件匹配多少個記錄,它都只會更新第一條。有點類似於.NET中的FirstOrDefault()方法。

同時,MQL還提供了 updateMany 方法以支援同時更新多個滿足條件的文件,例如這裡將所有人數為22人的team的名字都改為yzw-football-team:

db.teams.updateMany({members:22},{"$set":{name:"yzw-football-team"}});

除此之外,還可以使用 update 來更新陣列:

使用$push即可增加一個物件到陣列底部:

db.games.update({title:"Winning Eleven 2021"},
  {"$push": 
  { 
     versions:{"language": "Korean","code": "KO", "market": "South Korea"} 
  }});

此外,還可以使用$pushAll即可增加多個物件到陣列底部,使用$pop來從陣列底部刪除一個物件,使用$addToSet來實現如果不存在則新增一個值到陣列等等。這裡,就不再展示示例了。

4 remove操作

在MQL中,刪除文件的命令格式為:db.<collectionName>.remove,一般情況下它需要配合查詢條件來使用,否則它會刪除所有文件(慎用)。

remove操作示例:

db.teams.remove({name:"yzw-football-team"}); // 刪除name為yzw-football-team的文件
db.teams.remove({members:{"$lt":22}}); // 刪除members小於22人的文件
db.teams.remove({}); // 刪除所有文件,慎用

5 drop操作

在MQL中,刪除集合的命令格式為:db.<CollectionName>.drop()。

使用此命令,集合中的全部文件都會被刪除,集合相關的索引也會被刪除

例如,我們將teams這個集合刪除:

db.teams.drop(); // 慎用

那麼,如何刪除某個資料庫呢?可以使用 db.dropDatabase() 來刪除資料庫,需要注意的是 資料庫響應檔案也會被刪除,磁碟空間會得到釋放。

use studentsDB
db.dropDatabase(); // 慎用

6 總結

本文總結了MongoDB的基本操作,包括了insert、find、remove、update和drop。學會這些基本操作,我們就可以應對大部分的常見使用場景了。

下一篇,我們會學習如何通過.NET應用程式訪問和操作MongoDB。

參考資料

唐建法,《MongoDB高手課》(極客時間)

郭遠威,《MongoDB實戰指南》(圖書)

△推薦訂閱學習

作者:周旭龍

出處:https://edisonchou.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。