MongoDB增刪改查操作詳解(命令行)


一、插入

MongoDB的插入操作很簡單,使用insert方法,這里演示從創建數據庫、創建集合到插入文檔、查詢文檔。

集合創建方法參數說明:

size:集合最大空間

max:集合最多文檔數量

(超出sizemax限制都會刪除最早的記錄)

 

二、刪除

MongoDB刪除操作也很簡單,使用remove方法,這里演示刪除剛剛插入的文檔。

remove函數如果沒有傳參數,直接調用則是刪除集合中所有文檔。

 

三、更新

為了方便下面的演示,我事先在剛剛創建的‘blog’集合中插入了4個文檔:

1. 替換整個文檔(這里演示替換第一個文檔):

(這種情況下_id不變,若是要更新_id請注意防止鍵沖突)

2. 使用修改器更新文檔指定部分:

1)$inc:數字增加/減少

(若對應鍵不存在則會先創建鍵,若鍵對應值不是數字則會報錯)

2$set:設置鍵值

(可以操作多種數據類型,可以改變鍵值的數據類型,還可以用於修改內嵌文檔,若對應鍵不存在則會先創建鍵)

(3)$unset:刪除某個鍵

(4)$push:若對應鍵已存在則會向已有數組末尾加入一個元素,否則會創建一個新的數組。

(5)$addToSet:如果一個值不在數組里面就把它加進去,使用方法和$push一樣,只是不能添加重復的元素。

$addToSet$each組合起來,可以一次向數組中添加多個不同的值。

(6)$pop:從數組任何一端刪除一個元素。

(貌似負數都是從頭部刪除,0和正數都從末尾刪除)

(7)$pull:刪除數組中所有符合條件的元素。

(8)使用數組下標選擇需要修改的數組元素:

(9)使用定位符選擇需要修改的數組元素:

修改器速度:

$inc不需要改變文檔大小,所以速度非常快。

數組修改器可能更改了文檔大小,速度比較慢。

$set在文檔大小不發生變化時速度比較快,否則性能也會有所下降。

MongoDB預留了些補白給文檔來適應大小變化,但要是超出了原來的空間,還是要分配一塊新的空間。

要是$push成為瓶頸,可以將內嵌數組獨立出來,放到單獨一個集合里面。

3. upsert:

如果存在符合條件的文檔則更新,否則以匹配條件和更新文檔為基礎插入文檔。

update()函數的第三個參數設置為true即可。

4. saveshell函數,文檔不存在時插入,存在時更新。

函數參數為一個文檔,若文檔存在_id’鍵則調用upsert,否則調用insert

5. 更新多個文檔:

默認情況下,更新只能對符合匹配條件的第一個文檔執行操作,要使所有匹配到的文檔都得到更新,

可以設置update()函數的第4個參數為true。(這個行為今后可能會被更改)

若想知道到底更新了多少文檔,可以運行命令:

db.runCommand({getLastError:1})

打印出來的結果中n”對應的數值就是被更新的文檔的數量。

6. findAndModify:先返回結果然后更新。

findAndModify命令中每個鍵對應的值:

findAndModify:字符串,集合名稱。

query:查詢文檔,用來檢索文檔的條件。

sort:排序方式,1表示升序,-1表示降序。

update:修改器文檔,對找到的文檔執行的更新操作。

remove:布爾類型,表示是否刪除文檔,默認不刪除。

new:布爾類型,表示返回更新前的文檔還是更新后的文檔,默認返回更新前的文檔。

Update鍵和remove鍵必須有且僅有一個,如果匹配不到文檔這個命令會報錯。

一次只能處理一個文檔,也不能執行upsert操作,只能更新已有文檔。

相對普通更新來說,findAndModify速度要慢一些,大概耗時相當於一次查找、一次更新和一次getLastError順序執行所需的時間。

 

四、查詢

1.一般條件查詢:

_id鍵總是會被返回,除非顯式將其剔除)

查詢條件表示符:

$lt(<)$lte(<=)$gt(>)$gte(>=)$ne(<>)

2. OR查詢:

OR查詢有兩種方式:$in$or$in只能對單個鍵做or查詢,如需要對多個鍵做or查詢應該使用$or$in對應的還有$nin

3. $mod:將查詢的值除以第一個給定值,若余數等於第二個給定值則返回該文檔。

4. $not:元條件句,可以用在任何其他條件之上。

5. null值查詢:

6. 正則表達式查詢:

不區分大小寫:db.blog.find({'content':/mongodb/i})

也可以使用$regex操作符來做正則表達式查詢:

db.blog.find({'title':{$regex:'lo W'}})

不區分大小寫:db.blog.find({'title':{$regex:'lo W',$options:'$i'}})

7. 數組查詢:

1$all通過多個元素來匹配數組(元素順序無關)

(2)$size:根據數組長度查詢。

(3)$slice:返回數組元素的一個子集合.

使用$slice將返回文檔中所有的鍵,除非在第二個參數中顯式剔除。

(4)查詢內嵌文檔:

查詢整個內嵌文檔與普通查詢完全相同,但是查詢文檔的鍵值對順序一定要和內嵌文檔的鍵值對順序一致,否則無法匹配,所以如果

內嵌文檔增加或刪除了鍵的話,相對應的查詢也要進行更改,比較好的做法是只針對內嵌文檔的特定鍵值進行查詢(使用點表示法)。

5$elemMatch:將限定條件進行分組,僅當需要對一個內嵌文檔的多個鍵操作時才會用到。

示圖中兩次查詢的區別:

第一次查詢,只要comments鍵對應數組中有兩個元素分別滿足查詢文檔中的兩個查詢條件或同一個元素同時滿足這兩個條件,

都會返回這個文檔;第二次查詢,則需要在數組同一個元素中同時滿足這兩個條件才會返回這個文檔。

8. $where查詢:可以執行任意JavaScript作為查詢的一部分。

如果函數返回true,文檔就作為結果的一部分被返回,否則不返回。

使用$where查詢時,每個文檔都要從BSON轉換成JavaScript對象,然后通過$where的表達式來運行,而且還不能利用索引,

所以在速度上要比常規查詢慢很多,只有在走投無路時才能考慮$where查詢。

可以將常規查詢作為前置過濾,與$where組合使用,這樣不犧牲性能,也可以使用索引根據非$where子句進行過濾,$where

只用於對結果進行調優。

 

注意:

  當文檔某個鍵對應值為內嵌文檔,需要對其進行完全匹配查詢的時候,必須保證查詢的值跟文檔中的一模一樣,連鍵值對的順序也要一樣才能進行匹配,例如:db.friend.find({'info':{'nick':'yamu','age':30}})和db.friend.find({'info':{'age':30,'nick':'yamu'}})是不一樣的,若是friend集合中存在某個文檔info鍵值為{'age':30,'nick':'yamu'},第一個查詢是無法匹配到這個文檔的,只有第二個查詢能匹配。

  對文檔中鍵值為數組的字段進行完全匹配查詢的時候也一樣,需要保證查詢的值跟文檔中的一模一樣,包括鍵值對的順序。與內嵌文檔不一樣的是,數組字段的查詢可以根據某個數組元素的值進行查詢而無需指定數組下標,而內嵌文檔根據鍵值進行查詢的時候必須指定內嵌文檔中的鍵名。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM