mongodb数据库
mongodb数据库的学习使用
一, mongodb简介和概念
- 非关系型的 NOSQL
- 跨平台
- 非关系型里最像关系型的
- 排名
- 特点
1,文档: 就是json ,就是键值对
2, 集合: 文档的集合
- mysql: 用户 - 库 - 表
-
mongo: 库 - 集合
二, mongodb的使用
库的操作
登陆 默认连接到test库,但是test可以不存在
查看哪些库
show dbs
如何创建库 – use 可以切换库,但是库可以不存在,如果对数据进行操作,库会保留下来
use mydb1
如何删库?
第一步 切库
§ > use tutorial
第二步 删库 db.drop tab键有提示
> db.dropDatabase()
查看当前库有哪些集合
show tables
show collections
三, 文档的插入数据
语法 : db.collection_name.insert(json)
插入数据
db.songli.insert({id:90, name:’杨艳’, age:25})
发现字段个数可以不同,类型也可以不同
db.songli.insert({id:2,name:’陈丽’,age:’29’,sex:’ma女’})
内嵌文档的玩法
db.songli.insert({ id:3,name:’王蓉’,age:28,like:{wuliep:’iandao’,chi:’深度看风景’} })
save 指令大多数时候与insert相同,当指定了_id的时候,save相当于调用update
db.songli.save({id:4,name:’王盼盼’,age:55})
批量新增
格式:db.SRC_COLL.find().forEach( function(x){ db.NEW_COLL.insert(x)} )
SRC_COLL 原集合
NEW_COLL 新集合
db.songli.find().forEach( function(x){ db.chenli.insert(x)} )
注意执行的时候,主键不会重复,反复插入,相同数据不会增加
四,查看文档
语法:db.COLLECTION_NAME.find(COND_JSON,SHOW_JSON)
DBQuery.shellBatchSize=30 设置默认显示行
1. 查看巴萨队内全部球员
db.Barca.find()
-
查看梅西的详细信息
db.Barca.find({ name:’messi’ })
-
查看年龄为29,并且是踢中后卫(pos为CB)的球员
db.Barca.find({ $and:[{age:29},{pos:’CB’}] })
-
查看年龄大于25,并且是中场的球员 MF
大于gtgreaterthan小于 lt less than
大于等于gtegreaterequalthan小于等于 lte
不等于 $ne not equaldb.Barca.find({ and:[ { age:{gt:25} },{pos:’MF’}] })
-
上述查询只返回一条记录,findOne到一个就返回.sort
db.Barca.findOne({ $and:[ { age:{$gt:25} },{pos:'MF'}] })
db.Barca.find({ and:[ { age:{gt:25} },{pos:’MF’}] }).pretty()
- 显示球员姓名,年龄,位置 部分列显示 需要使用show_json,1代表显示,0代表不显示
db.Barca.find({},{name:1,age:1,pos:1})
db.Barca.find({},{name:1,age:1,pos:1,_id:0})
- 显示球员的不同年龄
db.Barca.distinct(‘age’)
重点部分
1,显示进球数超过30的球员信息 lgdata的第一个值代表进球数,第二个值代表助攻数
db.Barca.find({ “lgdata.0”:{$gt:30} } )
2,显示助攻数超过20的球员信息
db.Barca.find({ “lgdata.1”:{$gt:20} } )
3,显示年龄是24或者29的球员信息 select * from Barca where age = 24 or age =29;
db.Barca.find( { $or:[{age:24},{age:29}] })
4,显示年龄不是24或者29的球员信息
db.Barca.find( { age:{$nin:[24,29]} })
5, 显示位置为空的球员信息 pos为null 或者没有pos都能找到
db.Barca.find({ pos:null })
6, 将球员按照年龄排序 sort排序 1代表升序,-1代表降序
db.Barca.find().sort( {age:1})
7, 显示第11名球员信息
db.Barca.find().skip(10).limit(1)
五, 修改文档
语法:
2017年11月16日
11:27
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
<query> 条件
<update> 对应要修改的内容
upsert 如果条件不存在,<update>的内容是否作为新增,默认是false
multi: 是否一次修改多条 ,默认是false
writeConcern: <document> 异常类型 WriteConcern.NORMAL
1, 将vhalirvic的位置修改为null
db.Barca.update( { name:’vhalirvic’},{ $set:{pos:null} })
2, 将 vhalirvic 的年龄改为25岁,位置改成SB
db.Barca.update( { name:’vhalirvic’},{ $set:{pos:’SB’,age:25} })
3, 将pos为null的球员信息修改为 pos=MF
db.Barca.update( { pos:null},{ $set:{pos:’MF’} })
4 , 将年龄为24的球员年龄全部修改为 25
db.Barca.update({age:24},{ $set:{age:25} })
5,multi起作用,一次修改多条
db.Barca.update({age:24},{ $set:{age:25} },{upsert:false,multi:true})
6,相当于 覆盖原内容
db.Barca.update({age:25},{ age:30 })
> db.Barca.update({name:'lixunhuan'},{id:1,name:'lixunhuan'},{upsert:false,multi:false})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
,7,upsert起作用
db.Barca.update({name:’lixunhuan’},{id:1,name:’lixunhuan’},{upsert:true,multi:false})
六, 删除文档
语法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
<query> 删除的条件
justOne 是否只删除一条,false
db.Barca.remove({age:25})
WriteResult({ “nRemoved” : 7 })
删除集合
db.Barca.drop()
true
集合是第一次新增数据的时候创建的
七,索引
**索引是通过有序来提高查询效率的
查看所有索引**
db.system.indexes.find()
ns 代表集合名
key 代表 按哪个字段建的索引 “_id” : 1 1 代表升序索引 -1代表降序索引 段 自动创建索引
创建索引
按照名字创建升序索引
db.Barca.ensureIndex({name:1})
如何使用索引 必须作为查询条件
BasicCursor 代表未使用索引
db.Barca.find({age:24}).explain()
{
“cursor” : “BasicCursor”,
“isMultiKey” : false,
“n” : 6,
“nscannedObjects” : 22,
“nscanned” : 22,
“nscannedObjectsAllPlans” : 22,
“nscannedAllPlans” : 22,
“scanAndOrder” : false,
“indexOnly” : false,
“nYields” : 0,
“nChunkSkips” : 0,
“millis” : 0,
“server” : “localhost.localdomain:27017”,
“filterSet” : false
}
使用索引的情况 BtreeCursor name_1
db.Barca.find({name:’messi’}).explain()
{
“cursor” : “BtreeCursor name_1”,
“isMultiKey” : false,
“n” : 1,
“nscannedObjects” : 1,
“nscanned” : 1,
“nscannedObjectsAllPlans” : 1,
“nscannedAllPlans” : 1,
“scanAndOrder” : false,
“indexOnly” : false,
“nYields” : 0,
“nChunkSkips” : 0,
“millis” : 0,
“indexBounds” : {
“name” : [
[
“messi”,
“messi”
]
]
},
“server” : “localhost.localdomain:27017”,
“filterSet” : false
}
“cursor”:“BasicCursor”表示本次查询没有使用索引;“BtreeCursor name_1 ”表示使用了name上的索引;
“isMultikey”表示是否使用了多键索引;
“n”:本次查询返回的文档数量;
“nscannedObjects”:表示按照索引指针去磁盘上实际查找实际文档的次数;
”nscanned“:如果没有索引,这个数字就是查找过的索引条目数量;
“scanAndOrder”:是否对结果集进行了排序;
“indexOnly”:是否利用索引就能完成查询; db.Barca.find( {name:'neymar'},{_id:0,name:1} ).explain()
“nYields”:如果在查询的过程中有写操作,查询就会暂停;这个字段代表在查询中因写操作而暂停的次数;
“ millis”:本次查询花费的毫秒数,数字越小说明查询的效率越高;
“indexBounds”:这个字段描述索引的使用情况,给出索引遍历的范围。
"filterSet" : 是否使用和索引过滤;
删除索引
db.Barca.dropIndex({name:1})
{ “nIndexesWas” : 2, “ok” : 1 }
八,聚合函数
聚合函数:分组函数
1,显示集合的记录总数
db.Barca.find().count()
2,求各个位置的最小年龄 select pos,min(age) from Barca group by pos;
db.Barca.aggregate( {$group:{_id:"$pos",minage:{$min:"$age"}}} )
$group 操作符 作为分组使用
按什么分组 _id 就对应什么内容
"$pos" 取pos的实际值
"$age" 取age 的实际值
4,求各个位置的最大年龄
db.Barca.aggregate( {$group:{_id:"$pos",maxage:{$max:"$age"}}} )
5, 求各个位置的平均年龄
db.Barca.aggregate( {$group:{_id:"$pos",avgage:{$avg:"$age"}}} )
6, 求各个位置的年龄和
db.Barca.aggregate( {$group:{_id:"$pos",sumage:{$sum:"$age"}}} )
7, 统计各个位置的人数 select count(*),pos from Barca group by pos;
db.Barca.aggregate( {$group:{_id:"$pos",count:{$sum:1}}} )
8, 统计不同位置不同年龄的人数 group by pos,age
db.Barca.aggregate( {$group:{_id:{xpos:"$pos",xage:"$age"},count:{$sum:1}}})
上一篇: MongoDB数据库
下一篇: 重温 js基础系列之闭包 1-理解闭包