查看当前数据库:db
查看所有数据库:show dbs / show databases
切换数据库(不存在则创建,在没有真正插入数据以前,使用show dbs,查看不到):use database_name
删除当前数据库:db.dropDatabase()
创建集合:
创建空集合:db.createCollection(name,options)
db.createCollection('ts1')
db.createCollection('ts2', {capped:true,size:10})
capped:默认值false表示不设置上限,true表示设置上限
size:当capped为true时需要指定该参数,表示上限大小,当文件到达上限时,会将之前的数据覆盖,单位为字节
使用插入命令,集合不存在则创建:db.ts2.insert({name:"xiaohong"})
数据类型
Object ID:文档ID
string:字符串,必须是有效的utf-8
Boolean:布尔类型false或者true
integer:整型
double:浮点型
arrays:数组或者列表,多个值存储到一个键
object:用于嵌入式的文档,即一个值为一个文档
null:存储Null值
timestamp:时间戳
date:存储当前日期或者时间的Unix时间格式
查看所有集合:show collections
删除集合:db.ts1.drop()
集合中插入数据:
insert:当插入的数据的__id相同时会报错
db.ts2.insert({_id:111,name:"xiaohong"})
db.ts2.insert({_id:111,name:"aaa"})
save:当插入的数据的__id相同时会直接修改
查看集合中的数据:
db.集合名.find({条件文档}) 返回符合条件的全部
db.集合名.findOne({条件文档}) 返回符合条件的第一条
db.集合名.find({条件文档}).pretty() 将返回结果按格式输出
db.ts2.find({age:18}) 等于18
db.ts2.find({age:18,name:"xiaohong"}) 年龄等于18且名字是xiaohong
db.ts2.find({$or:[{age:18},{age:20}]}) 年龄等于18或者20岁的
db.ts2.find({$or:[{age:18},{age:20}],{name:"xiaohong"}}) 年龄等于18或者20岁的且名字为xiaohong
db.ts2.find({age:{$lte:18}}) 小于等于18
db.ts2.find({age:{$gte:18}}) 大于等于18
db.ts2.find({age:{$ne:18}}) 不等于18
db.ts2.find({age:{$in:[12,16,18]}}) 年龄属于12,16,18
db.ts2.find({age:{$nin:[12,16,18]}}) 年龄不属于12,16,18
db.ts2.find({name:/^abc/}) 名字以abc开头的
db.ts2.find({name:{$regex:"^abc"}}) 名字以abc开头的
db.ts2.find({age:18}).limit(2) 显示头两条
db.ts2.find({age:18}).skip(2) 跳过头两条,显示剩下的
db.ts2.find({age:18}).skip(2).limit(5) 指定显示从第三条开始之后的5条
db.ts2.find({$where:function(){return this.age<=18}}) 返回年龄大于18的所有字段
db.ts2.find({$where:function(){return this.age<=18}},{name:1,__id:0}) 返回年龄大于18的name字段,__id默认显示,其他字段不显示不能写name:0,会报错,直接不写就好了
db.ts2.find({age:18}).sort({age:1}) 将返回结果按年龄升序排序
db.ts2.find({age:18}).sort({age:-1}) 将返回结果按年龄降序排序
db.ts2.find({age:18}).sort({age:-1,name:1}) 将返回结果按年龄降序且名字升序排序
db.ts2.find({},{name:1}) 返回所有记录的name属性键值
db.ts2.find({age:18}).count() 返回年龄等于18的记录数
db.ts2.count({age:18}) 返回年龄等于18的记录数
db.ts2.distinct("name") 返回不重名的数组
db.ts2.distinct("name",{age:{$gt:18}}) 返回不重名的,且年龄大于18的数组
更新:db..update(<query>,<update>,{multi:<boolean>})
query:查询条件
update:更新操作符
multi:可选,默认是false,表示只更新找到的第一条记录,true更新所有满足条件的文档,必须和$set合用
db.ts2.update({name:"xiaogang"},{name:"xiaohong"}) 如果原来的集合中还如除name中的其他键,则通通会消失,这条命令是替换的意思
db.ts2.update({name:"xiaogang"},{$set:{name:"xiaohong"}}) 只改变name对应的值,集合中其它键值不变,只更新一条符合条件的文档
db.ts2.update({name:"xiaohong"},{$set:{name:"yses"}},{multi:true}) 只改变name对应的值,集合中其它键值不变
删除:db.ts2.remove(<query>,{justOne:<boolean>})
query:可选,删除文档的条件
justOne:可选,默认false,删除全部符合条件的,true只删除查找到的第一条符合条件的文档
db.ts2.remove({name:"xiaohong"},{justOne:true})
数据的备份和恢复:
备份语法(ubantu命令终端):mongodump -h dbhost -d dbname -o dbdirectory
-h 服务器地址,也可以指定端口
-d 需要备份的数据库名称
-o 备份数据存放位置,此目录中存放着备份出来的地址
mongodump -h 192.268.1.1:27017 -d test1 -o /usr/local/mongodb/data/
恢复:mongorestore -h dbhost -d dbname --dir dbdirectory
-h 服务器地址
-d 需要恢复的数据库实例
--dir 备份数据所在位置
mongorestore -h 192.268.1.1:27017 -d test2 --dir /usr/local/mongodb/data/test1
聚合:是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
db.集合名.aggregate({管道:{表达式}})
常用管道命令:
$gruop 将集合中的文档分组,可用于统计结果
$group 对应的字典有几个键,结果中就有几个键
分组依据需要放置_id后面
取不同的字段的值需要使用$
去字段嵌套的字段中的值的时候 $_id.country
能够同时按照多个键进行分组 {$group:{_id:{country:"$country",province:"$province"}}}
db.stu.aggregate(
{
$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}
}
)
使用$group统计整个文档
db.stu.aggregate(
{$group:{
_id:null,count:{$sum:1},mean_age{$avg:"$age"}}
}
)
db.stu.aggregate(
{
$group:{
_id:null,count:{$sum:1},mean_age{$avg:"$age"}
}
},
{$project:{gender:$_id,conut:1,mean_age:1,_id:0}}
)
$match 过滤数据,只输出符合条件的文档
$project 修改文档的输出结构,如重命名、增加、删除字段、创建计算结果
$sort 将输入文档排序后输出
$limit 限制聚合管道返回的文档数
$skip 跳过指定数量的文档,返回剩余文档
$unwind 将数组类型的字段进行拆分
表达式:
$sum 计算总和,$sum:1 表示以一倍计数
$avg 平均值
$min 最小值
$max 最大值
$push 在结果文档中插入值到一个数组中
$first 根据资源文档的排序获取第一个文档数据
$last 根据资源文档的排序获取最后一个文档数据
创建索引:提升查询速度
测试:插入10万条数据到数据库
for(i=0,i<100000;i++){db.t245.insert({name:"test"+i,age:i})}
db.t245.find({name:"test10000"}).explain("executionStats") 查看本次查询花费时间
建立索引 db.t245.ensureIndex({name:1}) 按照name创建索引,1表示升序,-1表示降序
在默认情况下索引字段的值可以相同
创建唯一索引(索引的值是唯一的)
建立索引 db.t245.ensureIndex({name:1},{"unique":true})
建立联合索引,解决单条索引无法去重的问题 db.t245.ensureIndex({name:1},{age:1})
删除索引:db.t245.dropIndex({name:1})
python操作MongoDB
from pymongo import MongoClient
# 实例化client,建立连接
client = MongoClient(host='localhost', port=27017)
# 选择数据库和集合
collection = client["test"]["t245"]
# 插入数据,返回的是id字符串
ret = collection.insert({"name":"xiaowang","age":10})
# 插入多条数据
data_list = [{"name":"test{}".format(i)} for i in range(10)]
collection.insert_many(data_list)
# 查询一个记录,返回字典
ret1 = collection.find_one({"name":"xiangwang"})
# 查询所有记录,返回游标对象,像迭代器,只能循环一次,再循环取不到数
ret2 = collection.find({"name":"xiangwang"})
for ret in ret2:
print(ret)