mongodb数据库的详细使用

mongodb数据库
  • 简单使用
查看帮助:mongod –help
启动:sudo service mongod start
停止:sudo service mongod stop
重启:sudo service mongod restart
查看是否启动成功:ps ajx|grep mongod
配置文件的位置:/etc/mongod.conf, 
默认端⼝:27017
日志的位置:/var/log/mongodb/mongod.log


启动本地客户端:mongo
查看帮助:mongo –help
退出:exit或者ctrl+c


  • 常见操作
查看当前数据库 db
查看所有数据库 show dbs / show databases
切换数据库 use db_name
删除当前数据库 db.dropDatabase()


不手动创建集合:
向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来
手动创建集合:
db.createCollection(名字,信息)
db.createCollection(name,options)
db.createCollection("stu")
db.createCollection("sub", { capped : true, size : 10 } )
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
查看集合:show collections
删除集合:db.集合名称.drop()


db.集合名称.insert(document)
db.stu.insert({name:'gj',gender:1})
db.stu.insert({_id:"20170101",name:'gj',gender:1})
插人文档时, 如果不指定_id参数, MongoDB会为文档分配一个唯一的ObjectId

db.集合名称.save(document)
如果文档的_id已经存在则修改, 如果文档的_id不存在则添加

查询:db.集合名称.find()

  • 数据类型
Object ID: 文档ID
String: 字符串, 最常用, 必须是有效的UTF-8
Boolean: 存储一个布尔值, true或false
Integer: 整数可以是32位或64位, 这取决于服务器
Double: 存储浮点值
Arrays: 数组或列表, 多个值存储到⼀个键
Object: 用于嵌入式的⽂档, 即一个值为一个⽂档
Null: 存储Null值
Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
Date: 存储当前前期或时间的UNIX时间格式


创建⽇期语句如下 :参数的格式为YYYY-MM-DD
     new Date('2017-12-20')

每个文档都有一个属性, 为_id, 保证每个文档的唯一性
可以自己去设置_id插入文档,如果没有提供, 那么MongoDB为每个文档提供了一个独特的_id, 类型为objectID

objectID是一个12字节的十六进制数:
前4个字节为当前时间戳
接下来3个字节的机器ID
接下来的2个字节中MongoDB的服务进程id
最后3个字节是简单的增量值

常见命令使用

启动客户端
mongo
查看当前数据库
db
查看数据库
show dbs /show databases;
切换数据库
use 数据库名字
数据库使用时自动创建,但是里面有数据才可以显示出来
删除数据库 
db.dropDatabase()


集合在插入数据时自动创建
手动创建集合
db.createCollection()
查看集合 
show collections
删除集合
db.集合名称.drop()


文档
插入文档,_id不指定可以自动分配
db.集合名称.insert({'name':'小张'})
保存文档,文档_id存在则修改,不存在则添加
db.集合名称.save({name:'小胖子'})
更新文档
db.集合名称.update({'gender':0},{$set:{gender:1}}),把gender:0修改为gender:1,修改一条
db.集合名称.update({},{$set:{gender:1}},{multi:true}),把gender:0修改为gender:1,修改全部
删除文档
db.集合名称.remove(<query>,{justOne: <boolean>})
参数query:可选,删除的文档的条件
参数justOne:可选, 如果设为true或1, 则只删除一条, 默认false, 表示删除多条

 
查询
简单查询
db.集合名称.find()
法find(): 查询
	db.集合名称.find({条件文档})
法findOne():查询,只返回第一个
	db.集合名称.findOne({条件文档})
法pretty(): 将结果格式化
	db.集合名称.find({条件文档}).pretty()


查询条件
等于: 默认是等于判断, 没有运算符
小于:$lt (less than)
小于等于:$lte (less than equal)
大于:$gt (greater than)
大于等于:$gte
不等于:$ne

db.stu.find({age:{$gte:18}})

#逻辑运算符
and:在json中写多个条件即可
查询年龄大于或等于18, 并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})

or:使用$or, 值为数组, 数组中每个元素为json
查询年龄大于18, 或性别为false的学生
db.stu.find({$or:[{age:{$gte:18}},{gender:false}]})
db.stu.find({$or:[{age:{$gte:18}},{gender:false}]})

查询年龄大于18或性别为男生, 并且姓名是郭靖
db.stu.find({$or:[{age:{$gt:18}},{gender:true}],name:'gj'})
    
#范围查询 查询年龄在18到28之间的学生,
db.stu.find({age:{$in:[18,28]}})
#范围查询 查询年龄不在18到28之间的学生
db.stu.find({age:{$nin:[18,28]}})

# 支持正则匹配的模糊查询
db.stu.find({name:{$regex:'^黄'}})
db.stu.find({name:/^/})

#限制查询 limit,只查询指定的数量
db.stu.find().limit(2)
# 跳过指定数量的文档,skip ,意思是跳过五个文档后查询两个文档
db.stu.find().skip(5).limit(2)
# js语句,支持where自定义查询,类似于js
# 查询年龄大于18的学生
db.stu.find({$where:function(){return this.age>18;}})


#投影,可以指定查询显示的字段,显示就使用1,不显示不写,特殊的_id不显示使用0
db.stu.find({查询的条件,不写就是全部},{_id:0,name:1})

# 排序sort,-1表示降序,1表示升序
db.stu.find().sort({gender:-1,age:1})

# count()统计数量
db.stu.find({条件}).count()
db.stu.count({条件})

# distinct 对指定字段去重
db.stu.distinct('字段',{条件})


# aggregate 聚合函数,管道
# 常用管道
在mongodb中,文档处理完毕后, 通过管道进行下一次处理
常用管道如下:
$group: 将集合中的文档分组, 可用于统计结果
$match: 过滤数据, 只输出符合条件的文档
$project: 修改输出文档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输出文档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的文档, 并返回余下的文档
$unwind: 将数组类型的字段进行拆分

# 表达式
处理输入文档并输出
语法:表达式:'$列名'
常用表达式:
$sum: 计算总和, $sum:1 表示以一倍计数
$avg: 计算平均值
$min: 获取最小值
$max: 获取最大值
$push: 在结果文档中插入值到一个数组中
$first: 根据资源文档的排序获取第一个文档数据
$last: 根据资源文档的排序获取最后一个文档数据

#group分组
#统计男生,女生的总数,这里的group是分组,_id是分组依据,'$gender'是使用某个字段,counters是用来统计结果的
db.stu.aggregate({$group:{_id:'$gender',counter:{$sum:1}}})

# 把集合中的所有文档分为一组,求学生总数和平均年龄
db.stu.aggregate({$group:{_id:null,counter:{$sum:1},avgs:{$avg:'$age'}}})

# 统计不同性别学生的姓名
db.stu.aggregate({$group:{_id:'$gender',name:{$push:"$name"}}})

# 使用$$ROOT,可以把文档内容加入到结果集的数组中
db.stu.aggregate({$group:{_id:"$gender",name:{$push:"$$ROOT"}}})

# 练习
{ "country" : "china", "province" : "sh", "userid" : "a" }, 
{  "country" : "china", "province" : "sh", "userid" : "b" },
{  "country" : "china", "province" : "sh", "userid" : "a" }, 
{  "country" : "china", "province" : "sh", "userid" : "c" },  
{  "country" : "china", "province" : "bj", "userid" : "da" },  
{  "country" : "china", "province" : "bj", "userid" : "fa" } 

# 插入多条数据使用,db.stu.insertMany({[]}),插入的数据是一个数组
需求:统计出每个country/province下的userid的数量(同一个userid只统计一次)
db.test1.aggregate({$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},
{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}},
{$project:{country:'$_id.country',province:'$_id.province',count:1,_id:0}}               )


# match管道用来过滤使用
# 查询年龄大于18的学生,男生女生的人数
db.stu.aggregate({$match:{age:{$gte:18}},
                  {$group:{_id:'$gender',count:{$sum:1}}})

#查询男生,女生的人数,输出人数
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1}}},
                {$project:{_id:0,count:1}}
                )

# 排序 sort
# 查询出男生,女生的人数按照人数降序
db.stu.aggregate({$group:{_id:'$gender',count:{$sum:1}}},{$sort:{count:-1}})
                  
#$limit $skip


将文档中的某一个数组类型字段拆分成多条, 每条包含数组中的一个值
语法:db.集合名称.aggregate({$unwind:'$字段名称'})
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
db.t2.aggregate({$unwind:'$size'})

结果如下:
{ "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_id" : 1, "item" : "t-shirt", "size" : "L" }

属性值为false表示丢弃属性值为空的文档
属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档

测试:插入10万条数据到数据库中,底层是js代码所以支持js格式
for(i=0;i<100000;i++){db.t12.insert({name:'test'+i,age:i})}


# 索引
添加索引
db.stu.ensureIndex({'name':1},{'unique':true})
# 查看索引
db.stu.getIndexes()
# 添加联合索引
db.stu.ensureIndex({'name':1,'age':1})
# 删除索引
db.stu.dropIndex({索引名称})


#数据库的备份与恢复
备份的语法:
    mongodump -h dbhost -d dbname -o dbdirectory
-h: 服务器地址, 也可以指定端⼝号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此目录中存放着备份出来的数据

mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
    
恢复语法:
     mongorestore -h dbhost -d dbname --dir dbdirectory
-h: 服务器地址
-d: 需要恢复的数据库实例
--dir: 备份数据所在位置

mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

 尝试将我电脑中的douban.tv1中的数据恢复到自己的电脑中,具体如何操作?

完成上述操作后完成以下问题:
1.获取每条数据中的title,count(所有评分人数),rate(评分),country(国家)的这些字段
2.获取上述结果中的不同国家电视剧的数据量
3.获取上述结果中分数大于8分的不同国家电视剧的数据量

db.tv1.aggregate({$project:{title:1,_id:0,count:"$rating.count",rate:"$rating.value",country:"$tv_category"}},{$match:{rate:{$gt:8}}},{$group:{_id:'$country',count:{$sum:1}}})


# pymongo的操作

from pymongo import MongoClient

# 链接mongodb对象
client = MongoClient(host='127.0.0.1', port=27017)
# 链接数据库和集合
collection = client['test']['t3']  # 数据库和集合
# 插入数据
ret = collection.insert({'name': 'xiaoli', 'age': 19}) #返回Id

# print(ret)
# 查找数据
ret = collection.find() # 生成一个游标集,游标集遍历完后后面的将不再遍历,只有一次
# ret1 = list(ret)
# print(ret)
# for i in ret1:
#     print(i)
# for j in ret1:
#     print('********',j)

# 一个练习,字段是id,和name 插入数据是 {_id:0-999,name:'py0'-py999},再取出id是100的倍数的name值
# t3 = collection.insert_many([{'_id':i,'name': 'py{}'.format(i)} for i in range(1000)])
# print(t3_list)
ret = collection.find()

t3_list = [i['name'] for i in ret if i['_id'] !=0 and i['_id'] % 100 ==0]
print(t3_list)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值