iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
2

這邊我們選用Robo 3T來作為操作MongoDB的工具,對於入門來說會降低許多門檻。
此篇大部分都用Shell來操作,GUI介面可以看到結果呈現,如果要新增DB、Collection、Document也是可以直接使用Roto 3T的GUI介面操作,這就不在此篇多做介紹了。

以下我們分為以下來介紹:

  • DB新增刪除
  • Document增刪修查

DB新增刪除

這邊我們先開啟Shell輸入

use testDB

MongoDB還蠻智能的,如果沒有testDB他就會建置一個資料庫,如果已經存在就會切換到該資料庫。

接著我們使用

db

就可以看到我們當下使用的DB名稱

我們試試看新增一張名為testCollection的Collection,Document為{"name":"2018 ithome鐵人賽"}

db.testCollection.insert({"name":"2018 ithome鐵人賽"})

成功新增後我們就來看看有哪些DB

show dbs

若要刪除的話,請使用use DB_NAME切換到你要刪除的DB,接著輸入

db.dropDatabase()

我們再用一次

show dbs

可以看到testDB就被刪掉囉~

Document增刪修查

Insert Document

使用 insert() 或 save() 方法。
Document的結構類似JSON,在這邊我們稱它叫BSON(Binary JSON)。

使用的語法如下 :

db.COLLECTION_NAME.insert(Document)
//切換到testDB
use testDB 

//在col中新增Document
db.col.insert({title: '2018 ithome鐵人賽', 
    description: 'MongoDB+Robo 3T CRUD操作',
    by: '酷哥',
    tags: ['mongodb', 'database', 'ithome']
})

使用find()來看看我們insert的資料

//查看一筆
db.col.findOne()

P.S.在Robo 3T的console可以去用GUI去切換顯示方式歐


當然也可以一次新增多筆,且資料格式還可以不一樣(scheme free),是不是超級自由。

P.S. Scheme Free當然對資料正確性相對薄弱,MongoDB也有提供Schema Validation去建立Table Scheme。

db.col.insert([{title: '2018 ithome鐵人賽', 
    description: 'MongoDB+Robo 3T CRUD操作',
    by: '酷哥',
    tags: ['mongodb', 'database', 'ithome']},
    {name:"Linda"},
    {name:"Lue",age:22},
    {name:"James",birthday:"2000/01/01"}])

也可以將Document設為變量把資料準備好,然後再執行insert

doc={title: '2018 ithome鐵人賽', 
    description: 'MongoDB+Robo 3T CRUD操作',
    by: '酷哥',
    tags: ['mongodb', 'database', 'ithome']
}

db.col.insert(doc)

或是跑迴圈insert

for (i=1;i<=5;i++){
 v1=Math.ceil(Math.random()*10)+Math.ceil(Math.random()*20);
 db.col_2.insert({_id: i,a:v1,b:i});
}

db.col_2.find()

Update Document

使用 update() 方法。

使用的語法如下 :

db.collection.update( criteria, objNew, upsert, multi )

update()接受以下四個參數:

  • criteria : update的查詢條件,類似sql update查詢內where後面的。
  • objNew : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
  • upsert : 這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
  • multi : mongodb默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。

我們先來insert一些資料

db.users.insert([
    {name:"Linda"},
    {name:"Lue",age:22},
    {name:"James",birthday:"2000/01/01"},
    {name:"Webber",birthday:"1988/01/01",city:"Kaohsiung"},
    {name:"Wade",birthday:"2010/01/01",phone: "234-5678"}])
    
db.users.find()

對Lue的這筆資料,更新city欄位,雖然原來的資料裡沒有city的欄位,但還是會將city新增進去。

db.users.update({name:"Lue"},{$set:{city:"Taipei"}})

db.users.find({name:"Lue"})

這時候如果沒有使用$set就會發生以下冏事,我們這次對Wade這筆資料也嘗試著更新city欄位。

db.users.update({name:"Wade"},{city:"Taipei"})

db.users.find({name:"Wade"})

這時候發現在find() Wade這筆資料的時候找不到(Fetched 0 record),我們用find()全部看看為什麼。
https://ithelp.ithome.com.tw/upload/images/20181029/20105684vdbPrYRq17.jpg

我們發現第五筆資料的name、birthday、phone全部都不見了,只剩下city:"Taipei",因為這邊我們並沒有跟他說我們要set甚麼欄位,所以找到Wade這筆資料後,就用{city:"Taipei"}這個document把整個第五筆取而代之。

更多實例大家可以試試看它的效果

//有找到目標才更新,只更新第一筆
db.test0.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } )
//有找到目標才更新,更新找出的每筆
db.test0.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true )
//沒有找到目標,還是更新第一筆
db.test0.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false )
//沒有找到目標,還是更新每筆
db.test0.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true )
//有找到目標才更新,更新找出的每筆
db.test0.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true )
//有找到目標才更新,更新第一筆
db.test0.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false )

Delete Document

使用 remove() 方法。
在 remove前,可以先用find()檢查看看條件是否正確,避免誤刪。

使用的語法如下 :

db.collection.remove(
   <query>,
   <justOne>
)

參數說明 :

  • query :(可選)刪除的文檔的條件。
  • justOne : (可選)如果設為 true 或 1,則只刪除一個文檔。
  • writeConcern :(可選)拋出異常的級別。

我們先來insert一些資料

db.users.insert([ 
{name:"酷哥",birthday:"1988/01/01",city:"Kaohsiung"},
{name:"酷哥",birthday:"1988/01/01",city:"Kaohsiung"},
{name:"酷哥",birthday:"1988/01/01",city:"Kaohsiung"}])
    
db.users.find()

我們新增了三筆一樣的資料並使用'name'='酷哥'當條件

    db.users.remove({'name':'酷哥'})

    db.users.find()

發現這三筆資料都被砍光光了,如果我們只想刪除這三筆中的一筆,需要在justOne 參數設1,如下

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果要刪除所有數據可以使用

db.col.remove({})

上一篇
Day 13 Mongo DB 安裝與設定
下一篇
Day 15 AngularTri專案架構配置 - Share Dialog
系列文
三十天利用Angular與.net Core開發實戰一波32

1 則留言

0
Darwin Watterson
iT邦研究生 4 級 ‧ 2018-10-30 11:20:57

我也是用這套來管控 MongoDB/images/emoticon/emoticon12.gif

我要留言

立即登入留言