您的位置:首页 > 数据库 > Mongodb

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}
}
])

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: