python使用mongodb

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)


作者:草根菜 创建日期:2020-06-27 12:53:24 浏览量:3520