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' } )
db. stu. find( { age: { $in : [ 18 , 28 ] } } )
db. stu. find( { age: { $nin: [ 18 , 28 ] } } )
db. stu. find( { name: { $regex: '^黄' } } )
db. stu. find( { name: / ^ 黄/ } )
db. stu. find( ) . limit( 2 )
db. stu. find( ) . skip( 5 ) . limit( 2 )
db. stu. find( { $where: function( ) { return this. age> 18 ; } } )
db. stu. find( { 查询的条件,不写就是全部} , { _id: 0 , name: 1 } )
db. stu. find( ) . sort( { gender: - 1 , age: 1 } )
db. stu. find( { 条件} ) . count( )
db. stu. count( { 条件} )
db. stu. distinct( '字段' , { 条件} )
在mongodb中,文档处理完毕后, 通过管道进行下一次处理
常用管道如下:
$group: 将集合中的文档分组, 可用于统计结果
$match: 过滤数据, 只输出符合条件的文档
$project: 修改输出文档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输出文档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的文档, 并返回余下的文档
$unwind: 将数组类型的字段进行拆分
处理输入文档并输出
语法:表达式: '$列名'
常用表达式:
$sum : 计算总和, $sum : 1 表示以一倍计数
$avg: 计算平均值
$min : 获取最小值
$max : 获取最大值
$push: 在结果文档中插入值到一个数组中
$first: 根据资源文档的排序获取第一个文档数据
$last: 根据资源文档的排序获取最后一个文档数据
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" } } } )
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" }
需求:统计出每个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 } } )
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 } }
)
db. stu. aggregate( { $group: { _id: '$gender' , count: { $sum : 1 } } } , { $sort: { count: - 1 } } )
将文档中的某一个数组类型字段拆分成多条, 每条包含数组中的一个值
语法: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 } } } )
from pymongo import MongoClient
client = MongoClient( host= '127.0.0.1' , port= 27017 )
collection = client[ 'test' ] [ 't3' ]
ret = collection. insert( { 'name' : 'xiaoli' , 'age' : 19 } )
ret = collection. find( )
ret = collection. find( )
t3_list = [ i[ 'name' ] for i in ret if i[ '_id' ] != 0 and i[ '_id' ] % 100 == 0 ]
print ( t3_list)