您现在的位置是:网站首页> 编程资料编程资料

MongoDB Shell 命令实例总结【进阶篇】_MongoDB_

2023-05-27 407人已围观

简介 MongoDB Shell 命令实例总结【进阶篇】_MongoDB_

本文实例讲述了MongoDB Shell 命令。分享给大家供大家参考,具体如下:

原始文件请到我的github上去下载:https://github.com/yangqingxian/mongodb

这里先讲几件事:

1、这是第三次修改这篇文章了,也是第一次正真意义上的使用 github 来控制版本,想想还是有点小激动的:)
2、其中的内容结构与 mongodb基础命令是一致的,只不过添加了很多内容进去,适用于想进一步学习mongodb数据库的人
3、我其实也是菜鸟,所以我会用很白目的语言来解释其中的内容,如果你也跟我一样,那就两只鸟一起飞吧
4、接下来的内容均是我对《MongoDB大数据权威指南(第2版)》的摘记
5、其中的命令例子并没有事先创建好数据库、集合,都是要用到的时候临时写的,注意理解

mongodb数据库结构与传统关系型数据库的比较,便于理解接下来的内容

数据库->集合->文档
数据库->表  ->列

--------------------数据库内容------------------

查看所有数据库

 show dbs 

删除数据库

 db.dropDatebase() 

--------------------集合内容--------------------

创建集合

 db.createCollection() 

查看所有集合\表

 show collections show tables 

选定某一集合

 use db_name 

查看集合的信息

 db.stats() 

删除一个集合,但是需要先指定一个数据库,即先执行 use db_name

 db.dropDatabase() 

修改集合的名称

 db.collection_name.renameCollection('new_name') 

----------------------文档内容---------------------

插入数据

 db.collection_name.insert(document) db.collection_name.save(document) 

查询数据多条数据

 db.collection_name.find() 

1、可以指定返回的内容

参数解释

 db.collection_name.find( {query_term:value}, return_key_name:1} ) 

a find()函数的第一个参数是查询条件,即匹配该内容的文档都会被筛选出来,如果没有查询条件,则输入{},不可以为空
b find()函数的第二个参数是指定返回的内容,例如一个student的集合中的一个xiaoming文档中包含多条内容,姓名、学生号、家庭住址等,现在我只想看姓名,不想查询的时候返回xiaoming文档的全部内容,就可以使用这种'键名:1'的形式,后面的1表示筛选出该内容并正序输出,0表示筛选出除了该内容的其余部分,-1表示逆序跟1一样的结果
c 可以返回多条记录,这里只是举个例子,还是拿ixaoming的例子

 { 'name':1, 'student_id':1 } 

这样就返回了两个信息,一个name,一个student_id

2、查询嵌套信息

结合二维数组理解下面的这个信息

 { 'name':'yang', 'sex':'man', 'skill':[ {'php':1}, {'mongodb':4}, {'redis':5} ], 'favorite_food':'meat' } 

其中如果使用skill来作为find()的查询条件的话,千万别写成这样

---错误例子---

 db.self.find({'skill':[{'php':1}]}) 

这样是查不到的,因为这样mongodb会将{'skill':[{'php':1}]}解析成skill数组下只包含'php':1这一条记录的内容,上面的例子明显不符合这一要求,所以查询不到

---正确的例子---

 db.self.find({'skill.php':1}) 

这里使用了 . 告诉mongodb数据库去匹配skill数组下php为1的内容,重点在于skill下是否有'php':1这一条记录

---正确例子2---

如果一定要使用上面的错误例子的方式查询数据,可以使用$elemMatch参数,注意该参数使用的位置

 db.self.find({ 'skill':{$elemMatch: {'php':1} } }) 

这里的$elemMatch是作为条件操作符来使用的

查询单条数据

 db.collection_name.findOne() 

 

skip 跳过查询的最开始的数量,limit,限制返回数量,sort,当 x:1 表示正序,x:-1 表示逆序

 db.collection_name.find().skip(Number).limit(Number).sort({x:1}) 

计算符合查询条件的文档的数量

 db.collection_name.find().count() 

count()函数默认情况下会忽略skip()或limit()函数,例如假设student集合中有4个文档,下面的三条语句将显示不同的结果

db.student.find().limit(1).count() 结果为4,count忽略了limit(1)的条件

db.student.find().limit(1).count(true) 结果为1,为count()传入参数true

获取结果的唯一值

 db.collection_name.distinct('key_name') 

也是查询的函数,只不过他比起find()会将查询结果显示唯一值,而不是根据原有集合中,文档的数量来显示结果,结合关系型数据库中的distinct来理解,举个例子,有一个图书集合--books,该集合下有书名,作者,出版日期等信息,注意,一个作者可能写了很多本书,现在我想查看在该集合中有多少作者,如果我直接使用上面的find()函数来搜索的话

 db.books.find( {}, {'writer':1} ) 

这样会将全部的作者列出来,但是很多都是重复的,因为find()是根据文档数量来返回结果的,而distinct()会将结果筛选,
其中重复的部分

 db.books.distinct('writer') 

将查询结果分组

 db.collection_name.group() 
  • 参数1 key 按照此key进行分组
  • 参数2 initial 设置变量,该变量会在最终输出,注意,这个变量是对每个分组都会定义一个的,一个新的分组开始就重新创建
  • 参数3 reduce 一个函数,在文档分组期间执行,即对一个文档进行一次分组就会执行一次,传入两个参数,一个是代表initial的参数,一个是目前进行分组的文档,为了便于理解,分别取名叫out和doc
  • 参数4 keyf,可选,作用跟key一样,但是可以指定一个函数创建一个原本不存在于文档中的字段作为分组的依据,需要传入一个当前文档的参数
  • 参数5 cond 过滤条件,只有满足该条件的文档才能参与分组
  • 参数6 finalize 在分组完成后执行的函数,传入代表initial的参数
    下面来看一个例子就能大致上了解了,先传入几个文档到orders集合中
 data1={ "_id" : ObjectId("552a330e05c27486b9b9b650"), "_class" : "com.mongo.model.Orders", "onumber" : "002", "date" : ISODate("2014-01-03T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 1, "price" : 4.0, "pnumber" : "p002" } } data2={ "_id" : ObjectId("552a331d05c275d8590a550d"), "_class" : "com.mongo.model.Orders", "onumber" : "003", "date" : ISODate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 10, "price" : 2.0, "pnumber" : "p001" } } data3={ "_id" : ObjectId("552a333105c2f28194045a72"), "_class" : "com.mongo.model.Orders", "onumber" : "003", "date" : ISODate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 30, "price" : 4.0, "pnumber" : "p002" } } data4={ "_id" : ObjectId("552a333f05c2b62c01cff50e"), "_class" : "com.mongo.model.Orders", "onumber" : "004", "date" : ISODate("2014-01-05T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 5, "price" : 4.0, "pnumber" : "p002" } } db.orders.insert(data1) db.orders.insert(data2) db.orders.insert(data3) db.orders.insert(data4) 

接下来展示group()函数

例1

 db.orders.group({ key:{data:1,'item.pnumber':1}, initial:{'total':0}, reduce:function (doc,out){ out.total+=doc.item.quantity } }) 

首先是按照data和ietm数组中的pnumber分组
接着定义了输出变量total,记录每个产品的总数
接着是定义处理函数,也就是reduce中的函数,注意,传入参数的先后顺序,第一个参数表示当前进行分组的文档,第二个参数表示initial,所以doc能直接调用doc.item.quantity,即文档的内容,out能调用out.total,即initial的内容

例2

 db.orders.group({ keyf:function(doc){ return {'month':doc.date.getMonth()+1}; }, initial:{'total':0,'money':0}, reduce:function (doc,out){ out.total+=doc.item.quantity*doc.item.price }, finalize:function (out){ out.avg=out.money/out.total; return out; } }) 

首先,这个例子展示了keyf的用法,他返回了一个新的字段--month,接下来mongodb会按照month的计算结果分类
接着,就是在keyf以及finalize的函数中都有传入参数,其实这个参数跟reduce中的参数名字没有关系,这里写在一起主要是为了便于理解其含义
最后就是在finalize中临时创建了一个变量avg,这个avg在最后也是会被输出的
最后一点,在函数中处理结果都是会被return的

----------------使用条件操作符来筛选查询结果------------------

一般情况下都使用在find()的第一个参数内部,作为筛选条件使用

---$gt,$lt,$get,$lte,$ne---

 db.collection_name.find( { key_name:{$gt:value} }) 

注意操作符的位置,看例子可以便于理解

 db.student.find( { 'height':{$gt:180} }) 

表示筛选出学生集合中身高高于180的学生

可以同时使用两个操作符来指定范围

 db.student.find({ 'height':{$gt:180,$lt:220} }) 

这两个的使用方法跟上面是一样的,但是需要单独拎出来讲,因为有点特殊

---$in,$nin---

 db.student.find({ 'height':{$in:[170,180,190,200]} }) 

表示筛选出身高为170,180,190,200的学生,$nin就是筛选除了170,180,190,200之外的学生

---$all---

上面的$in中的内容是‘或'的形式,只要你的身高是170,或180,或190,或200,那么你就符合筛选条件,而$all则是且的关系

 db.student.find({ 'height':{$all:[170,180,190,200]} }) 

这句话的意思是你的身高既是170,又是180,又是190,又是200才能满足条件

---$or---

 db.student.find({ $or:[ {'score':100}, {'sex':man} ] }) 

上面的例子中,score:100与sex:man是‘或'的关系,结合下面的例子就可以看出$or的作用了

 db.student.find( {'score':100,'sex':'man'} ) 

其中的score:100与sex:man是且的关系

limit(x)函数加skip(y)函数=$slice:[y,x]

具体使用方法可以看下面这个例子

 db.student.find( {}, {'height':{$slice:[10,5]}} ) 

还是那句老话,注意$slice的位置,这句话表示筛选身高第11到15的人,第一个参数是skip()的参数,第二个是limit()

limit()函数是限制返回文档的数量的,$size是筛选符合数量的数组的,看下面的例子就明白了

先在数据库中添加以下信息

 message={ 'cds':[ {'first_song':'hello'}, {'second_song':'world'}, {'third_song':'again'} ] } db.songs.insert(message) 

接着我们来查询一下上述结果

 db.songs.find( {'cds':{$size:2}} ) 

无返回结果,因为cds数组里有3组数据

 db.songs.find( {'cds':{$size:3}} ) 

返回全部结果,注意一点,这里是作为find()函数的第一个参数传入的,所以是筛选条件

筛选含有特定字段的值

 db.collection_name.find( { key_name:{$exit:true} }) 

返回存在该字段的文档,注意,这里是存在该字段,而没有指定该字段的具体内容

根据数据类型筛选返回结果

 db.collection_name.find( { 'key_name':{$type:x} }) 

其中的x取值内容有很多,这里就不介绍了,因为太多了看一遍也没用

在筛选中使用正则表达式

 db.collection_name.find( { 'key_name':/ / }) 

在/  /中添加正则表达式的内容

更新数据

 db.collection_name.update({original_key:original_value},{new_key:new_value}) 

1、只要原 collection 中包含 original_key:original_value 就会被选中成为操作对象提示: 本文由整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!

-六神源码网