mongodb数据库

mongodb数据库的学习使用

一, mongodb简介和概念

  1. 非关系型的 NOSQL
  2. 跨平台
  3. 非关系型里最像关系型的
  4. 排名
  5. 特点

这里写图片描述

1,文档: 就是json ,就是键值对
2, 集合: 文档的集合

这里写图片描述

  1. mysql: 用户 - 库 - 表
  2. 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()
这里写图片描述

  1. 查看梅西的详细信息

    db.Barca.find({ name:’messi’ })

  2. 查看年龄为29,并且是踢中后卫(pos为CB)的球员

    db.Barca.find({ $and:[{age:29},{pos:’CB’}] })

  3. 查看年龄大于25,并且是中场的球员 MF
    大于 gtgreaterthan lt less than
    大于等于 gtegreaterequalthan lte
    不等于 $ne not equal

    db.Barca.find({ and:[ { age:{gt:25} },{pos:’MF’}] })

  4. 上述查询只返回一条记录,findOne到一个就返回.sort

      db.Barca.findOne({ $and:[ { age:{$gt:25} },{pos:'MF'}]    })
    

    db.Barca.find({ and:[ { age:{gt:25} },{pos:’MF’}] }).pretty()

  5. 显示球员姓名,年龄,位置 部分列显示 需要使用show_json,1代表显示,0代表不显示

db.Barca.find({},{name:1,age:1,pos:1})
db.Barca.find({},{name:1,age:1,pos:1,_id:0})

  1. 显示球员的不同年龄

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

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值