python使用mongodb
mongoDB数据库
优势:
易拓展:数据之前无关系,易拓展
大数据量,高性能:非常高的读写性能,尤其在大数据量下,数据库结构简单
灵活的数据模型:无需事先为存储的数据建立字段,随时可以存储自定义的数据格式
缺点:
数据量占用空间大
安装教程:
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
启动:
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 # 进入mongodb
show databases;
use dbname # 使用数据库,不需要创建数据库,直接可以使用
db # 查看当前数据库
db.dropDatabase() # 删除数据库
db.createCollection(name,option)
db.createCollection("stu")
db.createCollection("sub",{capped:true,size:10})
参数capped:默认值为false表示不设置上限,值为True时,size表示上限,单位为Mb,如果超过10MB则后面会覆盖前面的数据
show collections # 查看集合
数据类型:
Object ID:文档ID
String: 字符串
Boolean:布尔值,true或false
Integer: 整数,可以是32或64位,取决于服务器
Double: 浮点值
Arrays: 数组或列表,多个值存储到一个键
Object:用于嵌入式文档,即一个值为一个文档
Null:存储null值
Timestamp:时间戳,表示从1970-01-01到现在的总秒数
Date:存储当前日志或时间的Unix时间格式 创建:new Date('YYYY-MM-DD')
每个文档都有一个属性,为_id,保证每个文档的唯一性
可以自己去设置_id插入文档,如果没有提供,那么MongoDb为每个文档提供了一个独特的_id,类型为objectID
objectID十一个12字节的十六进制的数
前四个字节为当前时间戳
接下来3个字节的机器ID
接下来2个字节中MongoDb的服务进程ID
最后3个字节是简单增量值
语法部分:
增删查改
查找
db.collectionname.find({条件文档}) # 查找
db.collectionname.findOne({条件文档}) # 只返回一个
db.collectionname.find({条件文档}).pretty()
增加
db.collectionname.insert({"name":"jack","age":18}) #插入
db.collectionname.insertMany({"name":"jack","age":18}) #插入
db.collectionname.insertOne({"name":"jack","age":18}) #插入
db.collectionname.save(document) # 如果文档_id已存在则修改,否则插入
修改
db.collectionname.update({query查询条件},{update新值},{multi:<boolean>}) 查询条件,更新值,是否多条更新
db.test1000.update({"name":"jack"},{"name":"jack ma","age":18}) # 将符合条件的全部替换为后面的值
db.test1000.update({"name":"jack"},{$set:{name:"jack ma"}}) # 只更新一条
db.test1000.update({"name":"jack"},{$set:{name:"jack ma"}},{multi:true}) # 更新全部
删除
db.collectionname.remove({query查询条件},{justOne:<boolean>}) 查询条件,默认true全部删除
比较运算符
等于:默认是等于运算符,没有此项
小于:$lt (less than)
小于等于:$lte (less than equal)
大于: $gt (greater than)
大于等于:$gte (greater than equal)
不等于: $ne (not equal)
db.collectionname.find({age:{$gte:18}})
范围运算符 $in $nin 判断是否在某个范围内
db.collectionname.find({age:{$in:[18,28,38]}})
逻辑操作符
db.collectionname.find({"age":18,"name":"jack"}) # 与 的关系
db.collectionname.find({$or:[{"age":18},{"name":"jack"}]) # 或 的关系
正则表达式:
db.collectionname.find({name:/^abc/})
db.collectionname.find({name:{$regex:'abc$'}})
分页和跳过
db.collectionname.find().skip(2)
db.collectionname.find().limit(2)
db.test1000.find().skip(1).limit(2)
自定义查询
db.collectionname.find({
$where:function(){
return this.age>30;
}
})
投影:
db.collectionname.find({},{_id:0,name:1,gender:0}) 参数为字段与值,值为1表示显示,0表不显示,_id默认显示,如果不想显示,需要指定为0
排序:
db.collectionname.find().sort({age:1}) # 1表示以age升序,-1表示以age降序
db.collectionname.find().sort({age:1,gender:1}) # 多条件排序
计数
db.collectionname.find({query}).cout()
db.collectionname.count({query})
去重
db.collectionname.distinct('去重字段',{条件})
db.test1000.distinct('hometown',{age:18})
备份和恢复:
mongodump -h localhost -d dbname -o dbdirectory
-h 服务器地址,也可以指定端口号
-d 需要备份的数据库名称
-o 备份的数据库存放位置,此目录存放着备份出来的数据
mongodump -h 127.0.0.1 -d test1 -o ~/Desktop/test1
mongorestore -h localhost -d dbname --dir dbdirectory
-h 服务器地址
-d 数据库实例
--dir 备份数据所在位置
聚合功能:
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成德国管道,可以对每个夹断的管道进行分组、过滤功能
然后经过一系列的处理,输出相应的结果
db.collectionname.aggregate({管道:{表达式}})
db.test1000.aggregate([
{$match:{status:"a"}}, # 1查询
{$group:{_id:"$cust_id",total:{$sum:"$amount"}}} # 1查询的结果进行分组,根据cust_id进行分组,再求和amount
])
$group: 分组
$match: 过滤数据,只输出符合条件的文档
$project: 修改输入文档的结构,如重命名、增加、删除字段 aggregate({$project:{_id:0,counter:1}})
$sort: 将输入的文档排序后输出
$limit: 限制聚合管道返回的文档数
$skip: 跳过指定数量的文档,并返回余下的文档
$unwind: 将数组类型的字段进行拆分
表达式:处理输入文档并输出
语法:表达式:'$列名'
$sum: 求和
$avg:
$min
$max
$push:在结果文档中插入值到一个数组中
$first: 根据资源文档的排序获取到第一个文档数据
$last: 根据资源文档的排序获取最后一个文档数据
$group
db.test1000.aggregate(
{$group: {
_id : "$gender"
counter : {$sum:1}
}}
)
db.test1000.aggregate({$group:{_id:"$gender",counter:{$sum:1}}})
db.test1000.aggregate({$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}})
{ "_id" : true, "count" : 1, "avg_age" : 17 }
{ "_id" : false, "count" : 2, "avg_age" : 18 }
{ "_id" : null, "count" : 1, "avg_age" : 16 }
null值分组
求学生总人数、平均年龄
db.test1000.aggregate(
{$group:{
_id:null,
counter:{$sum:1}
avgAge:{$avg:'$age'}
}}
)
$sort
db.test1000.aggregate({$sort:{age:1}}) 学生信息按年龄升序
db.test1000.aggregate({$group:{_id:"$gender",count:{$sum:1}}},{$sort:{count:-1}})
db.test1000.aggregate({
$unwind:{
path:'$字段名称',
preserveNullAndEmptyArrays:<boolean> # 保留属性值为空的文档
}
})
索引部分
创建索引
db.test1000.ensureindex({name:1}) 1表升序,-1表降序
查看所有索引
db.test1000.getIndexes()
删除索引
db.test1000.dropIndex({name:1})
python中使用Mongodb
安装pymongo
pip install pymongo
from pymongo import MongoClient
class TestMongo:
def __init(self):
client = MongoClient(host="127.0.0.1",port =27017)
self.collection = client["test"]["t1"] # test 表示数据库,t1表示集合
def test_insert(self, **kwargs):
ret = self.collection.insert(kwargs)
print(ret)
def test_insert_many(self,item_list):
item_list = [{"name":""}]
t = self.collection.insert_many(item_list)
for i in t.insert_ids:
print(i)