iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 6
0
Big Data

30天之你好MongoDB系列 第 6

30-6之新手村CRUD---更新之陣列欄位攻略

本篇文章將要說明陣列修改器$push,主要就是針對document中的陣列進行修改,同時他也可以搭配$each$slice$ne$addToSet$pop$pull來使用。

  • 陣列更新修改器攻略

呼好多……

~ 陣列更新修改器攻略 ~


$push

$push是陣列修改器,假如一個document中已經有陣列的結構,使用push會在陣列的尾末加入一個新元素,要是本來就沒有這個陣列,則會自動新建一筆。

使用方法如下範例,首先先新增一筆資料,然後新增加一個叫jackfans

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})
	db.user.update({"name":"mark"},
		{$push:{"fans" : "jack"}
	})

結果如下圖。

$each

$push一次新增只能新增一筆元素,而搭配$each就可以新增多筆。

使用方法如下範例,一樣首先新增一筆資料,然後這時我們一次新增三個fans分別為jacklandrymax

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})

	db.user.update({"name":"mark"},
		{"$push" : {"fans" : {"$each" : ["jack","lnadry","max"]}}}
	)

結果如下圖

$slice

如果你希望限制一個陣列的大小,就算多push進元素,也不要超過限制大小,這時你就可以用$slice,不過注意它是保留最後n個元素。

使用方法如下範例,新增一筆資料,然後我們希望fans人數不超過5人,但我們硬多塞一個人進去。

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})

	db.user.update({"name":"mark"},
		{"$push" : {"fans" : 
			{"$each" : ["jack","lnadry","max"],
			 "$slice" : -5 }}}
	)

執行結果如下,可以看到第一位steven被刪除,只保留了最後5位。

$addToSet

你可能有這個需求,假設你要新增一個元素到陣列裡,並且保證陣列內的元素不會重複,這時就可以使用$addToSet

使用方法如下範例,新增一筆資料,然後fanssteven、landry、stanly,這時我們在新增stevenjack進去,預期應該steven不會被新增進去,也就是不會產生兩個steven

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})
	
		db.user.update({"name":"mark"},
		{"$addToSet" : {"fans" : 
			{"$each" : ["steven","jack"] }}}
	)

執行結果如下,符合預期。

$pop$pull

$pop$pull這兩個修改器都是用來刪除元素用的,$pop可以從頭或尾刪除,而$pull則是基於特定條件來刪除。

先來看看$pop的使用範例。其中"fans":1代表從fans陣列尾刪除"fans":-1則從陣列頭刪除。

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})
	
	db.user.update({"name":"mark"},
		{"$pop" : {"fans":1}}
	)

下圖為執行結果。

這時我們在來看看$pull用法,假設我們要將crisisfans刪除,使用方法如下。

	db.user.insert({
		"name" : "mark",
		"fans" : ["steven","crisis","stanly"]
	})
	
	db.user.update({"name":"mark"},
		{"$pull" : {"fans":"crisis"}}
	)

執行結果如下圖

~ 結語 ~


今天說了不少個修改器簡單的進行總結一下。

  • 要將元素丟進陣列時可用$push
  • 要將『多個』元素丟進陣列時可搭配$each
  • 要限制陣列大小時請用$slice
  • 要保證陣列內容不重複請用$addToSet
  • 要刪除陣列元素請用$pop$pull

結束……又快要燒起來的fu+u^6

~ 參考資料 ~



上一篇
30-5之新手村CRUD---更新
下一篇
30-7之新手村CRUD---刪除
系列文
30天之你好MongoDB30

尚未有邦友留言

立即登入留言