天天看点

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