天天看點

Mongodb常用操作

mongodb使用

安裝mongodb,并啟動mongodb後,基本操作:

1

2

3

4

<code>show dbs; 顯示資料庫</code>

<code>show collections;顯示目前資料庫中的集合,類似mysql中資料庫的表</code>

<code>show users; 顯示使用者</code>

<code>use &lt;db name&gt; 切換目前資料庫,與mysql中一樣</code>

資料庫常用指令:

5

6

7

8

9

10

11

12

13

14

15

16

17

<code>MongoDB沒有建立資料庫的指令,但有類似的指令,先運作use &lt;db name&gt; 指令,之後就做一些操作,如db.createCollection(</code><code>'user'</code><code>),這樣就可以建立一個資料庫了。</code>

<code>删除目前使用的資料庫: db.dropDatabase();</code>

<code>從指定的主機上克隆資料庫: db.cloneDatabase(</code><code>'hostname/ip'</code><code>);</code>

<code>    </code> 

<code>從指定的機器上複制指定的資料庫到某個資料庫 db.copyDatabase(</code><code>'mydb'</code><code>,</code><code>'temp'</code><code>,</code><code>'127.0.0.1:27017'</code><code>)</code>

<code>修複目前資料庫: db.repairDatabase();</code>

<code>檢視目前使用的資料庫: db.getName() </code><code>/</code> <code>db</code>

<code>顯示目前db狀态 db.stats()</code>

<code>目前db版本 db.version()</code>

<code>檢視目前db的連結機器的位址 db.getMongo()</code>

Collection集合常用指令:

18

<code>建立一個集合: db.createCollection(</code><code>'name'</code><code>, {capped:&lt;Boolean&gt;,autoIndexId:&lt;Boolean&gt;,size:&lt;number&gt;,</code><code>max</code><code>:&lt;number&gt;})</code>

<code>    </code><code>name:是集合的名字,</code>

<code>    </code><code>capped: 是否啟用集合限制,如果啟用需要制定一個限制條件,預設不啟用,這個參數沒有實際意義</code>

<code>    </code><code>size:限制集合使用空間的大小,預設沒有限制</code>

<code>    </code><code>max</code><code>:集合中最大條數限制,預設為沒有限制</code>

<code>    </code><code>autoIndexId: 是否使用</code><code>id</code><code>作為索引,預設使用(true</code><code>/</code><code>false)</code>

<code>    </code><code>size 的優先級比</code><code>max</code><code>高</code>

<code>比如:</code>

<code>    </code><code>1</code><code>、db.createCollection(</code><code>'log'</code><code>) 沒有任何的大小,數量限制,使用_id作為預設索引</code>

<code>    </code><code>2</code><code>、限制集合空間的大小:db.createCollection(</code><code>'log'</code><code>,{size:</code><code>1024</code><code>}) 或db.createCollection(</code><code>'log'</code><code>,{capped:true,size:</code><code>1024</code><code>}),限制空間大小為</code><code>1M</code><code>,如果超出</code><code>1M</code><code>,則會删除最早的記錄</code>

<code>    </code><code>3</code><code>、限制集合的最大條數: db.createCollection(</code><code>'log'</code><code>,{</code><code>max</code><code>:</code><code>1024</code><code>}),建立一個名字為log集合,最大條數為</code><code>1024</code><code>,超過則會删除最早的一條記錄,這個不能使用capped:true,否則會報錯</code>

<code>    </code><code>4</code><code>、限制最大條數有限制使用空間大小,db.createCollection(</code><code>'log'</code><code>,{size:</code><code>1024</code><code>,</code><code>max</code><code>:</code><code>1024</code><code>})或 db.createCollection(</code><code>'log'</code><code>,{capped:true,size:</code><code>1024</code><code>,</code><code>max</code><code>:</code><code>1024</code><code>}) 限制集合最大使用空間為</code><code>1M</code><code>,最大條數為</code><code>1024</code><code>條</code>

<code>得到指定名稱的集合 db.getCollection(</code><code>'one'</code><code>)</code>

<code>得到目前db的所有集合 db.getCollectionNames()</code>

<code>顯示目前db所有集合索引的狀态 db.printCollectionStats()</code>

使用者相關相關操作:

<code>Mongodb使用者和認證 權限總結:</code>

<code>新安裝mongodb後開啟MongoDB服務時不添加任何參數時,預設是沒有權限驗證的,登入的使用者可以對資料庫任意操作而且可以遠端通路資料庫。此時,mongodb預設有一個admin資料庫,并且是空的,沒有記錄權限相關的資訊。當admin.system.users一個使用者都沒有時,即使mongodb啟動時添加了</code><code>-</code><code>-</code><code>auth參數,如果沒有在admin資料庫中添加使用者,此時不進行任何認證還是可以做任何操作。直到admin.system.users中添加了一個使用者。</code>

<code>需要注意的是:admin.system.users中将會儲存比在其它資料庫中設定的使用者權限更大的使用者資訊,擁有超級權限,也就是說在admin中建立的使用者可以對mongodb中的其他資料庫資料進行操作。</code>

<code>1</code><code>、mongodb系統中,資料庫是由超級使用者來建立的,一個資料庫可以包含多個使用者,一個使用者隻能在一個資料庫下,不同資料庫中的使用者可以同名!</code>

<code>2</code><code>、當admin.system.users一個使用者都沒有時,即使mongod啟動時添加了</code><code>-</code><code>-</code><code>auth參數,如果沒有在admin資料庫中添加使用者,此時不進行任何認證還是可以做任何操作(不管是否是以</code><code>-</code><code>-</code><code>auth 參數啟動),直到在admin.system.users中添加了一個使用者。</code>

<code>3</code><code>、特定資料庫比如DB1下的使用者User1,不能夠通路其他資料庫DB2,但是可以通路本資料庫下其他使用者建立的資料!</code>

<code>4</code><code>、不同資料庫中同名的使用者不能夠登入其他資料庫!比如DB1,DB2都有user1,以user1登入DB1後,不能夠登入到DB2進行資料庫操作!</code>

<code>5</code><code>、在admin資料庫建立的使用者具有超級權限,可以對mongodb系統内的任何資料庫的資料對象進行操作!</code>

使用者相關指令操作:

<code>添加一個使用者:db.addUser(</code><code>'name'</code><code>)或 db.addUser(</code><code>'username'</code><code>,</code><code>'passwd123'</code><code>,true) 添加使用者,設定密碼,是否為隻讀,預設為false</code>

<code>資料庫認證、安全模式  db.auth(</code><code>'username'</code><code>,</code><code>'passwd'</code><code>)</code>

<code>顯示目前所有使用者: show users;</code>

<code>删除使用者: db.removeUser(</code><code>'username'</code><code>)</code>

集合查詢:

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

<code>查詢所有記錄:</code>

<code>db.userInfo.find() 相當于:select </code><code>*</code> <code>from</code> <code>userInfo;</code>

<code>預設每頁顯示</code><code>20</code><code>條記錄,當顯示不下的情況下,可以用it疊代指令查詢下一頁,it後面不要加;可以設定每頁顯示資料的大小,用DBQuery.shellBatchSize</code><code>=</code> <code>50</code><code>;這樣每頁就顯示</code><code>50</code><code>條記錄了</code>

<code>查詢去掉集合中的某列的重複資料</code>

<code>db.userInfo.distinct(</code><code>'name'</code><code>)  相當于:select distict name </code><code>from</code> <code>userInfo;</code>

<code>查詢age</code><code>=</code><code>xx的記錄</code>

<code>db.userInfo.find({</code><code>'age'</code><code>:</code><code>22</code><code>})</code>

<code>查詢age&gt;</code><code>22</code><code>的記錄:</code>

<code>db.userInfo.find({age:{$gt:</code><code>22</code><code>}})  相當于:select </code><code>*</code> <code>from</code> <code>userInfo where age &gt;</code><code>22</code><code>;</code>

<code>查詢age&lt;</code><code>22</code><code>的記錄:</code>

<code>db.userInfo.find({age:{$lt:</code><code>22</code><code>}})</code>

<code>查詢age &gt;</code><code>=</code> <code>25</code><code>的記錄</code>

<code>db.userInfo.find({age:{$gte:</code><code>25</code><code>}})</code>

<code>查詢age &lt;</code><code>=</code> <code>25</code><code>的記錄</code>

<code>db.userInfo.find({age:{$lte:</code><code>25</code><code>}})</code>

<code>查詢age &gt;</code><code>=</code> <code>23</code> <code>并且 age &lt;</code><code>=</code> <code>26</code>

<code>db.userInfo.find({age:{$gte:</code><code>23</code><code>,$lte:</code><code>26</code><code>}})</code>

<code>查詢name中包含mongo的資料</code>

<code>db.userInfo.find({name: </code><code>/</code><code>mongo</code><code>/</code><code>}) 相當于:select </code><code>*</code> <code>from</code> <code>userInfo where name like ‘</code><code>%</code><code>mongo</code><code>%</code><code>’;</code>

<code>查詢name中以mongo開頭的</code>

<code>db.userInfo.find({name:</code><code>/</code><code>^mongo</code><code>/</code><code>}) 相當于:select </code><code>*</code> <code>from</code> <code>userInfo where name like ‘mongo</code><code>%</code><code>’;</code>

<code>查詢指定列name,age資料:</code>

<code>db.userInfo.find({},{name:</code><code>1</code><code>,age:</code><code>1</code><code>}) 相當于:select name, age </code><code>from</code> <code>userInfo;</code>

<code>當然name也可以用true或false,當用true的情況下,如例子一樣的效果,如果為false就排除name,顯示name以外的列的資訊。</code>

<code>查詢指定列name、age資料, age &gt; </code><code>25</code>

<code>db.userInfo.find({age:{$gt:</code><code>25</code><code>}},{name:</code><code>1</code><code>,age:</code><code>1</code><code>})</code>

<code>查詢name </code><code>=</code> <code>zhangsan, age </code><code>=</code> <code>22</code><code>的資料</code>

<code>db.userInfo.find({name:</code><code>'zhangsan'</code><code>,age:</code><code>22</code><code>})</code>

<code>查詢</code><code>10</code><code>條以後的資料</code>

<code>db.userInfo.find().skip(</code><code>10</code><code>)  相當于:select </code><code>*</code> <code>from</code> <code>userInfo where </code><code>id</code> <code>not</code> <code>in</code> <code>(selecttop </code><code>10</code> <code>*</code> <code>from</code> <code>userInfo);</code>

<code>查詢在</code><code>5</code><code>-</code><code>10</code><code>之間的資料</code>

<code>db.userInfo.find().limt(</code><code>10</code><code>).skip(</code><code>5</code><code>)</code>

<code>可用于分頁,limit是pageSize,skip是第幾頁</code><code>*</code><code>pageSize</code>

<code>and</code> <code>查詢</code>

<code>db.userInfo({</code><code>'name'</code><code>:</code><code>'hurry'</code><code>,</code><code>'age'</code><code>:</code><code>18</code><code>},{</code><code>'name'</code><code>:</code><code>1</code><code>,</code><code>'age'</code><code>:</code><code>1</code><code>}) 相當于:select name,age </code><code>from</code> <code>userInfo  where name</code><code>=</code><code>'hurry'</code>

<code>or</code><code>與查詢</code>

<code>db.userInfo.find({$</code><code>or</code><code>: [{age:</code><code>22</code><code>},{age:</code><code>25</code><code>}]}) 相當于:select </code><code>*</code> <code>from</code> <code>userInfo where age </code><code>=</code> <code>22</code> <code>or</code> <code>age </code><code>=</code> <code>25</code><code>;</code>

<code>使用</code><code>in</code><code>,</code><code>not</code> <code>in</code> <code>($</code><code>in</code><code>,$nin)</code>

<code>db.userInfo.find({</code><code>'age'</code><code>:{$</code><code>in</code><code>:[</code><code>10</code><code>,</code><code>22</code><code>,</code><code>26</code><code>]}})  相當于:select </code><code>*</code> <code>from</code> <code>users where age </code><code>in</code> <code>(</code><code>10</code><code>, </code><code>22</code><code>, </code><code>26</code><code>);</code>

<code>與null比對</code>

<code>db.userInfo.find({</code><code>'age'</code><code>:null})</code>

<code>查詢第一條資料:</code>

<code>db.userInfo.findOne() 相當于:selecttop </code><code>1</code> <code>*</code> <code>from</code> <code>userInfo;</code>

<code>或:db.userInfo.find().limit(</code><code>1</code><code>)</code>

<code>查詢某個結果集的記錄條數:</code>

<code>db.userInfo.find({age:{$gte:</code><code>25</code><code>}}).count() 相當于:select count(</code><code>*</code><code>) </code><code>from</code> <code>userInfo where age &gt;</code><code>=</code> <code>25</code><code>;</code>

<code>按照某列進行求和:</code>

<code>db.userInfo.find({sex:{$exists:true}}).count() 相當于select count(sex) </code><code>from</code> <code>userInfo;</code>

<code>大于,小于,大于或等于,小于或等于</code>

<code>$gt:大于</code>

<code>$lt:小于</code>

<code>$gte:大于或等于</code>

<code>$lte:小于或等于</code>

<code>不等于:$ne</code>

<code>取模運算:$mod</code>

<code>db.userInfo.find({</code><code>'a'</code><code>:{$mod:[</code><code>10</code><code>,</code><code>1</code><code>]}})</code>

<code>$</code><code>all</code>

<code>$</code><code>all</code> <code>與$</code><code>in</code><code>類似,但是他需要比對條件内所有的值:</code>

<code>如一個對象:{a:[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>]}</code>

<code>這個條件可以比對:db.userInfo.find(a:{$</code><code>all</code><code>:[</code><code>2</code><code>,</code><code>3</code><code>]})</code>

<code>但是這個條件就不行了,db.userInfo.find(a:{$</code><code>all</code><code>:[</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>]})</code>

<code>$size 是比對數組内的元素數量的</code>

<code>如一個對像:{a:[</code><code>'foo'</code><code>]}</code>

<code>這個語句就可以比對:db.userInfo.find({a:{$size:</code><code>1</code><code>}})</code>

<code>官網上說不能用來比對一個範圍内的元素,如果想找$size&lt;</code><code>5</code><code>之類的,他們建議建立一個</code>

<code>$exists</code>

<code>$exists用來判斷一個元素是否存在</code>

<code>如下:</code>

<code>db.userInfo.find({a:{$exists:true}}) 如果存在a就傳回</code>

<code>db.userInfo.find({a:{$exists:false}}) 如果不存在元素a 就傳回</code>

<code>$</code><code>not</code><code>取反</code>

<code>db.userInfo.find({</code><code>'name'</code><code>:{$</code><code>not</code><code>:</code><code>/</code><code>acme.</code><code>*</code><code>corp</code><code>/</code><code>i}})</code>

<code>$</code><code>type</code>

<code>$</code><code>type</code><code>基于bson </code><code>type</code><code>來比對一個元素的類型,像是按照</code><code>ID</code><code>來比對,bson類型和</code><code>id</code><code>對照表:</code>

類型描述

類型值

Double

String

Object

Array

Binary data

Object id

Boolean

Date

Null

Regular expression 

JavaScript code

Symbol

JavaScript code with scope

32-bit integer

Timestamp

64-bit integer

Min key

255

Max key

127

使用如下:

<code>db.userInfo.find({a:{$</code><code>type</code><code>:</code><code>2</code><code>}}) 如果是字元串即:string就傳回a</code>

<code>db.userInfo.find({a:{$</code><code>type</code><code>:</code><code>16</code><code>}}) 如果是</code><code>int</code><code>類型,就傳回a</code>

正規表達式

<code>mongo支援正規表達式,如</code>

<code>db.userInfo.find({name:</code><code>/</code><code>acme.</code><code>*</code><code>corp</code><code>/</code><code>i}) 後面i的意思是區分大小寫</code>

索引:

<code>建立索引:</code>

<code>db.userInfo.ensureIndex({name:</code><code>1</code><code>})</code>

<code>db.userInfo.ensureIndex({name:</code><code>1</code><code>,ts:</code><code>-</code><code>1</code><code>})</code>

<code>查詢目前集合所有索引:</code>

<code>db.userInfo.getIndexes()</code>

<code>檢視總索引記錄大小</code>

<code>db.userInfo.totalIndexSize()</code>

<code>讀取目前集合所有index資訊</code>

<code>db.userInfo.reIndex()</code>

<code>删除指定索引:</code>

<code>db.userInfo.dropIndex(</code><code>"name_1"</code><code>)</code>

<code>删除所有索引</code>

<code>db.userInfo.dropIndexes()</code>

添加:

<code>db.userInfo.save({</code><code>'name'</code><code>:</code><code>'zhangsan'</code><code>,</code><code>'age'</code><code>:</code><code>25</code><code>,sex:true})</code>

<code>添加的資料的資料列,沒有固定,根據添加的資料為準</code>

修改:

<code>db.userInfo.update({age:</code><code>25</code><code>},{$</code><code>set</code><code>:{name:</code><code>'lisi'</code><code>}},false,true)</code>

<code>相當于:update users </code><code>set</code> <code>name </code><code>=</code> <code>‘changeName’ where age </code><code>=</code> <code>25</code><code>;</code>

<code>db.userInfo.update({name:</code><code>'lisi'</code><code>},{$inc:{age:</code><code>50</code><code>}},false,true)</code>

<code>相當于:update users </code><code>set</code> <code>age </code><code>=</code> <code>age </code><code>+</code> <code>50</code> <code>where name </code><code>=</code> <code>‘lisi’;</code>

<code>db.userInfo.update({</code><code>'name'</code><code>:</code><code>'lisi'</code><code>},{$inc:{</code><code>'age'</code><code>:</code><code>50</code><code>},$</code><code>set</code><code>:{name:</code><code>'hoho'</code><code>}},false,true)</code>

删除:

<code>db.userInfo.remove({</code><code>'age'</code><code>: </code><code>132</code><code>})</code>

查詢修改删除:

<code>db.userInfo.findAndModify({</code>

<code>    </code><code>query:{age:{$gte:</code><code>25</code><code>}},</code>

<code>    </code><code>sort:{age:</code><code>-</code><code>1</code><code>},</code>

<code>    </code><code>update:{$</code><code>set</code><code>:{name:</code><code>'a2'</code><code>},</code>

<code>    </code><code>$inc:{age:</code><code>2</code><code>}},</code>

<code>    </code><code>remove:true})</code>

<code>db.runCommand({findandmodify:</code><code>'usersInfo'</code><code>,</code>

<code>    </code><code>query: {age:{$gte:</code><code>25</code><code>}},</code>

<code>    </code><code>sort: {age:</code><code>-</code><code>1</code><code>},</code>

<code>    </code><code>update:{$</code><code>set</code><code>:{name:</code><code>'a2'</code><code>},$inc:{age:</code><code>2</code><code>}},</code>

<code>update 或 remove 其中一個是必須的參數; 其他參數可選。</code>

排序:

<code>升序:db.userInfo.find().sort({age:</code><code>1</code><code>})</code>

<code>降序:db.userInfo.find().sort({age:</code><code>-</code><code>1</code><code>})</code>

将一個對象轉換成json

<code>tojson(new </code><code>Object</code><code>())</code>

<code>tojson(new Ojbect(</code><code>'a'</code><code>))</code>

循環添加資料:

<code>&gt; </code><code>for</code> <code>(var i </code><code>=</code> <code>0</code><code>; i &lt; </code><code>30</code><code>; i</code><code>+</code><code>+</code><code>) {</code>

<code>    </code><code>db.userInfo.save({name:</code><code>'u_'</code> <code>+</code> <code>i, age:</code><code>22</code> <code>+</code> <code>i,sex:i </code><code>%</code> <code>2</code><code>})</code>

<code>    </code><code>}</code>

<code>這樣就循環添加了</code><code>30</code><code>條資料,同樣也可以省略括号的寫法</code>

<code>&gt; </code><code>for</code> <code>(var i </code><code>=</code> <code>0</code><code>; i &lt; </code><code>30</code><code>; i</code><code>+</code><code>+</code><code>) {db.userInfo.save({name:</code><code>'u_'</code><code>+</code><code>i,age:</code><code>22</code><code>+</code><code>i,sex:i</code><code>%</code><code>2</code><code>})}</code>

find 遊标查詢

<code>&gt; var cursor </code><code>=</code> <code>db.userInfo.find()</code>

<code>&gt; </code><code>while</code> <code>(cursor.hasNext()) {</code>

<code>    </code><code>printjson(cursor.</code><code>next</code><code>())</code>

<code>這樣就查詢所有的users資訊,同樣可以這樣寫</code>

<code>var cursor </code><code>=</code> <code>db.users.find();</code>

<code>while</code> <code>(cursor.hasNext()) {printjson(cursor.</code><code>next</code><code>)}</code>

forEach疊代循環

<code>db.users.find().forEach(printjson)</code>

<code>forEach中必須傳遞一個函數來處理每條疊代的資料資訊</code>

将find遊标當數組處理

<code>var cursor </code><code>=</code> <code>db.users.find()</code>

<code>cursor[</code><code>4</code><code>]</code>

<code>取得下标索引為</code><code>4</code><code>的那條資料</code>

<code>既然可以當做數組處理,那麼就可以獲得它的長度:cursor.length();或者cursor.count();</code>

<code>那樣我們也可以用循環顯示資料</code>

<code>for</code> <code>(var i </code><code>=</code> <code>0</code> <code>,</code><code>len</code> <code>=</code> <code>c.length(); i &lt; </code><code>len</code><code>; i</code><code>+</code><code>+</code><code>) printjson(c[i])</code>

<code>将find遊标轉換成數組</code>

<code>&gt;var arr </code><code>=</code> <code>db.userInfo.find().toArray()</code>

<code>&gt;printjson(arr[</code><code>2</code><code>])</code>

<code>用toArray方法将其轉換為數組</code>

其他:

<code>查詢之前的錯誤資訊:db.getPrevError();</code>

<code>清除錯誤記錄:db.resetError()</code>

<code></code>

本文轉自 ZhouLS 51CTO部落格,原文連結:http://blog.51cto.com/zhou123/1650665