MongoDB学习笔记
2018-08-14 19:04
148 查看
版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z564359805/article/details/81672653
[code]一、Windows平台安装MongoDB参考: http://www.runoob.com/mongodb/mongodb-window-install.html 官网:https://www.mongodb.com/ 二、数据库常用操作 1、查看当前数据库:db 2、列出所有物理上存在的数据库:show dbs 3、切换数据库:use 数据库名 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建 4、删除当前数据库:db.dropDatabase() 三、集合创建 1、db.createCollection(name,options) options是一个文档,用于指定集合的配置 不限制集合大小:db.createCollection(‘stu’) 限制集合大小: db.createCollection(‘sub’,{capped:true,size:10}) 当capped值为true时,需要指定size参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节 2、查看当前数据库集合:show collections 3、删除集合:db.集合名称.drop() 四、数据插入、查询 1、db.集合名称.insert(document) db.stu.insert({name:’小王’,gender:1}) s1 = {_id:’20180508’,name:’hr’} s1.gender = 0 db.stu.insert(s1) 2、查询:db.集合名称.find() db.stu.find() 五、数据更新 db.集合名称.update(<query>, <update>,{multi:<boolean>}) • 参数query:查询条件,类似sql语句update中where部分 • 参数update:更新操作符,类似sql语句update中set部分 • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新 1、全文档更新:db.stu.update({name:’hr’},{name:’gj’}) 2、指定属性更新,这样gender不会变: db.stu.insert({name:’hr’,gender:0}) db.stu.update({name:’hr’},{$set:{name:’xhr’}}) 3、修改多条匹配到的数据,所有gender属性值变为0,即使没有gender属性也会添加上 db.stu.update({},{$set:{gender:0}},{multi:true}) 将所有gengder值为0的修改为1,没有gengder或者不匹配的不会更改 db.stu.update({gender:0},{$set:{gender:1}},{multi:true}) 六、保存 db.集合名称.save(document) 如果文档的_id已经存在则修改,如果文档的_id不存在则添加 不存在此_id,则添加数据 db.stu.save({_id:’20180808’,name:’xy’,gender:0}) 修改此_id的name值,不写gender系统则会自动删除掉 db.stu.save({_id:’20180808’,name:’yy’}) 七、删除 db.集合名称.remove(<query>,{justOne:<boolean>}) • 参数query:可选,删除的文档的条件 • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条 只删除匹配到的第一条:db.stu.remove({gender:0},{justOne:true}) 全部删除:db.stu.remove({}) 八、数据查询 find()方法:db.集合名称.find({条件文档}) findOne()方法,返回第一个:db.集合名称.findOne({条件文档}) 方法pretty(),将结果格式化: db.集合名称.find({条件文档}).pretty() 1、比较运算符 • 等于,默认是等于判断,没有运算符 • 小于$lt • 小于或等于$lte • 大于$gt • 大于或等于$gte • 不等于$ne 例子:查询名称等于‘gj’的学生 db.stu.find({name:’gj’}) 查询年龄大于等于18的学生 db.stu.find({age:{$gte:18}}) 2、逻辑运算符 默认逻辑与:查询年龄大于等于18并且gender为1的学生 db.stu.find({age:{$gte:18},gengder:1}) 查询年龄大于等于18并且gender小于1的学生 db.stu.find({age:{$gte:18},gender:{$lt:1}}) 逻辑或:$or 查询年龄大于18,或者性别为0的学生 db.stu.find({$or:[{age:{$gt:18}},{gender:0}]}) and和or一起使用: 查询年龄大于18或性别为0的学生,并且学生的姓名为gj: db.stu.find({$or:[{age:{$gt:18}},{gender:0}],name:’gj’}) 3、范围运算符(’$in’、’$nin’) 查询年龄为18-20之间的学生,包含20 db.stu.find({age:{$in:[18,20]}}) 4、支持正则表达式(使用//或$regex编写正则表达式) 查询姓李的学生: db.stu.find({name:/^李/}) db.stu.find({name:{$regex:’^李’}}) 5、自定义查询(使用$where后面写一个函数,返回满足条件的数据) 查询年龄大于30的学生 db.stu.find({$where:function(){return this.age>20}}) 6、Limit()方法:用于读取指定数量的文档 db.集合名称.find().limit(要获取的文档条数) db.stu.find().limit(2) 7、skip()方法:用于跳过指定数量的文档 db.集合名称.find().skip(跳过记录结果条数,默认0) 查询从第三条开始的学生信息: db.stu.find().skip(2) 8、一起使用limit和skip,部分先后顺序 创建数据集:for(i=1;i<16;i++){db.t1.insert({_id:i})} 查询第五条至第九条的数据:(获取5个数据,跳过4个数据) db.t1.find().limit(5).skip(4) 九、投影 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段(值为1表示显示,值为0不显示) db.集合名称.find({},{字段名称:1,...}) • 对于需要显示的字段,设置为1即可,不设置即为不显示 • 特殊:对于_id列默认是显示的,如果不显示需要明确设置为0 只显示id和name字段:db.stu.find({},{name:1}) 除了name字段都显示:db.stu.find({},{name:0}) 不显示id,只显示name字段:db.stu.find({},{_id:0,name:1}) 除了id和name字段都显示:db.stu.find({},{_id:0,name:0}) 只显示name和age字段:db.stu.find({},{_id:0,name:1,age:1}) 十、排序:方法sort(),1为升序、-1为降序 db.集合名称.find().sort({字段:1,...}) 根据性别降序,再根据年龄升序 db.stu.find().sort({gender:-1,age:1}) 十一、统计个数:count() db.集合名称.find({条件}).count() 或者: db.集合名称.count({条件}) 统计男生的个数: db.stu.find({gender:1}).count() db.stu.count({gender:1}) 统计年龄大于20的男生人数 db.stu.find({age:{$gt:20},gender:1}).count() 统计年龄大于20或gender为0,且名字为小李的人数 db.stu.find({$or:[{age:{$gt:20}},{gender:0}],name:’小李’}).count() 十二、消除重复:distinct()去重 db.集合名称.distinct('去重字段',{条件}) 查找年龄大于18的学生,性别去重 db.stu.distinct(‘gender’,{age:{$gt:18}}) 十三、聚合:aggregate db.集合名称.aggregate([{管道:{表达式}}]) 管道:文档处理完毕后,通过管道进行下一次处理 表达式:处理输入文档并输出》》》用法:表达式:'$列名' 常用管道: • $group:将集合中的文档分组,可用于统计结果 • $match:过滤数据,只输出符合条件的文档 • $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 • $sort:将输入文档排序后输出 • $limit:限制聚合管道返回的文档数 • $skip:跳过指定数量的文档,并返回余下的文档 • $unwind:将数组类型的字段进行拆分 常用表达式: • $sum:计算总和,$sum:1同count表示计数 • $avg:计算平均值 • $min:获取最小值 • $max:获取最大值 • $push:在结果文档中插入值到一个数组中 • $first:根据资源文档的排序获取第一个文档数据 • $last:根据资源文档的排序获取最后一个文档数据 1、$group(将集合中的文档分组,可用于统计结果) _id表示分组的依据,使用某个字段的格式为'$字段' 统计男生、女生的人数(counter可以换成其他名字) db.stu.aggregate([{$group:{_id:’$gender’,counter:{$sum:1}}}]) ------------------------------------------------------------------ db.stu.aggregate([ {$group: { _id:’$gender’, counter:{$sum:1} } } ]) ------------------------------------------------------------------
[code]group by null 求学生总人数、平均年龄 db.stu.aggregate([{$group:{_id:null,counter:{$sum:1},avgAge:{$avg:’$age’}}}]) ------------------------------------------------------------------ db.stu.aggregate([ {$group: { _id :null, 总人数:{$sum:1}, 平均年龄:{$avg:’$age’} } } ]) ------------------------------------------------------------------
[code]透视数据 统计学生性别和姓名 db.stu.aggregate([{$group:{_id:’$gender’,name:{$push:’$name’}}}]) ------------------------------------------------------------------ db.stu.aggregate([ {$group: { _id:’$gender’, name:{$push:’$name’} } } ]) ------------------------------------------------------------------
[code]使用$$ROOT可以将文档内容加入到结果集的数组中,代码如下: db.stu.aggregate([{$group:{_id:’$gender’,姓名:{$push:’$$ROOT’}}}]) ------------------------------------------------------------------ db.stu.aggregate([ {$group: { _id:’$gender’, 姓名:{$push:’$$ROOT’} } } ]) ------------------------------------------------------------------
[code]2、$match(用于过滤数据,只输出符合条件的文档) 查询年龄大于20的学生: db.stu.aggregate([{$match:{age:{$gte:18}}}]) db.stu.aggregate([ {$match: {age:{$gte:18}} } ]) 查询年龄大于等于18的男生、女生人数: db.stu.aggregate([ {$match:{age:{$gte:18}}}, {$group:{_id:’$gender’,counter:{$sum:1}}} ])
[code]查询年龄大于等于18的男生、女生人数及姓名: db.stu.aggregate([ {$match:{age:{$gte:18}}}, {$group:{_id:’$gender’, counter:{$sum:1},name:{$push:’$name’}}} ])
[code]3、$project(修改输入文档的结构,如重命名、增加、删除字段、创建计算结果) 查询学生的姓名、年龄: 方法一:db.stu.aggregate([{$project:{_id:0,name:1,age:1}}]) 方法二:db.stu.find({},{_id:0,name:1,age:1})
[code]查询男生、女生人数,输出人数: db.stu.aggregate([{$group:{_id:’$gender’,counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ])
[code]查询男生、女生人数,输出人数及具体姓名: db.stu.aggregate([{$group:{_id:’$gender’,counter:{$sum:1}, name:{$push:’$name’}}}, {$project:{_id:0,counter:1,name:1}} ])
[code]4、$sort(将输入文档排序后输出) 查询学生信息,按年龄升序: db.stu.aggregate([{$sort:{age:1}}])
[code]查询男生、女生人数,按人数降序: db.stu.aggregate([ {$group:{_id:’$gender’,counter:{$sum:1}}}, {$sort:{counter:-1}} ])
[code]5、$limit(限制聚合管道返回的文档数) 查询2条学生信息: db.stu.aggregate([{$limit:2}]) 6、$skip(跳过指定数量的文档,并返回余下的文档) 查询从第3条开始的学生信息: db.stu.aggregate([{$skip:2}]) 组合使用(注意顺序:先写skip,再写limit): 统计男生、女生人数及姓名,按人数升序,取第二条数据: db.stu.aggregate([ {$group:{_id:’$gender’,name:{$push:’$name},counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1} ])
[code]7、$unwind(将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值) 语法1:对某字段值进行拆分 db.集合名称.aggregate([{$unwind:'$字段名称'}]) 添加一条数据: db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']}) 进行查询: db.t2.aggregate([{$unwind:’$size’}])
[code]语法2:对某字段值进行拆分,处理空数组、非数组、无字段、null情况 db.集合名称.aggregate([{ $unwind:{ path:'$字段名称', preserveNullAndEmptyArrays:<boolean> #防止数据丢失 } }]) 添加数据: db.t3.insert([ { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] }, { "_id" : 2, "item" : "b", "size" : [ ] }, { "_id" : 3, "item" : "c", "size": "M" }, { "_id" : 4, "item" : "d" }, { "_id" : 5, "item" : "e", "size" : null } ]) 使用语法1查询,数据丢失: db.t3.aggregate([{$unwind:'$size'}]) 使用语法2查询: db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}]) db.t3.aggregate([ {$unwind: {path:’$size’,preserveNullAndEmptyArrays:true} } ])
阅读更多
相关文章推荐
- mongodb学习笔记
- mongoDB学习笔记3--python下使用
- MongoDB学习笔记一ID自增长
- mongodb 学习笔记
- MongoDB学习笔记(二) 通过samus驱动实现基本数据操作
- 【MongoDB学习笔记8】深入MongoDB的更新(update)操作:修改器$set
- MongoDB 学习笔记(四)C# 操作MongoDB
- mongodb学习笔记之索引(转)
- [MongoDB]学习笔记--User管理
- 【MongoDB学习笔记13】MongoDB的更新(update)操作进阶
- mongoDB学习笔记
- [MongoDB]学习笔记--基本操作
- PHP操作MongoDB学习笔记
- mongodb 学习笔记 04 -- 游标、索引
- MongoDB学习笔记(六)--复制集+sharding分片 && 总结
- MongoDB学习笔记-1
- MongoDB学习笔记
- MongoDB的学习笔记
- mongodb学习笔记--C++操作mongodb
- mongodb 学习----入门 笔记