通过 python 操作mongodb

库引入 

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接

import pymongo 

 

链接数据库

创建数据库需要使用 MongoClient 对象,并且指定连接的ip和端口号。

myclient=pymongo.MongoClient("localhost",27017)#连接数据库

 

查看数据库和集合

查看数据库

dbs=myclient.list_database_names()#查看所有数据库
dbs
['admin', 'config', 'local', 'test']
mydb=myclient['test']#切换/创建(不存在的时候)数据库test

 注意: 在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建 

查看集合 

colls=mydb.list_collection_names()#查看/罗列集合名
#colls
mycoll=mydb['c1']#切换/显示创建(不存在的时候)集合

文档增删改查

查看文档

myclient=pymongo.MongoClient("localhost",27017)#链接服务
mydb=myclient['test']#选择数据库
mycoll=mydb['c1']#选择集合
docs=mycoll.find()#查看文档
#打印文档
for i in docs:
    print(i

 

 插入文档

插入单个文档

insert_one为插入单个文档。该方法的第一参数是字典key:value 对

d1={"name":"hakgd","age":88,"major":"大数据"}#python中key也需要使用引号括起来
x=mycoll.insert_one(d1)#插入单个文档insert_one
print(x.inserted_id)#打印文档_id

 

insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id值。

插入多个文档 

集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。

d2=[
    {"name":"aklgd","age":44},
    {"name":"vkjz","age":88},
    {"name":"uixz","age":100}
]
x=mycoll.insert_many(d2)#插入多个文档 insert_many,参数为数组
print(x.inserted_ids)#打印多个文档_id

 

insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的_id 值

查询文档 

 查看全部文档

dos=mycoll.find()
for i in dos:
    print(i)

 

 因为插入数据时候重复运行了多次,所有数据重复了

按照条件查询
dos=mycoll.find({"age":88},{"_id":0})#find的使用和mongodb一致,第一个参数为查询条件,参数2为(不)显示的列
for i in dos:
    print(i)

 

还可以使用修饰符,按照范围查询 

dos=mycoll.find({"age":{"$lt":20}},{"_id":0})#find的使用和mongodb一致,第一个参数为查询条件,参数2为(不)显示的列
for i in dos:
    print(i)

 

 正则表达查询
dos=mycoll.find({"name":{"$regex":"^a"}},{"_id":0})#,第一个参数为查询条件,正则匹配name为a开头的文档
for i in dos:
    print(i)

增加查询说明

逻辑操作符

$and逻辑与,同时满足全部条件
$or逻辑或,满足其中之一条件即可

使用规则:

db.COLLECTION_NAME.find({$and:[{key1:value1},{key2:value2},......]})

db.COLLECTION_NAME.find({$or:[{key1:value1},{key2:value2},......]})

例如:

 更多查询方法请查看:MongoDB基本操作(一)-CSDN博客

 

管道操作 

聚合管道操作是将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。聚合管道是使用不同的管道阶段操作器进行不同聚合操作,管道阶段操作器也可称为管道操作符,常见管道操作符如下表。

常见管道操作符相关说明
$group将集合中的文档进行分组,便于后续统计结果
$limit用于限制MongoDB聚合管道返回的文档数
$smatch用于过滤数据,只输出符合条件的文档
$sort将输入的文档先进行排序,再输出
$project用于修改输入文档的结构(增加、删除字段等)和名称
$skip在聚合管道中跳过指定数量的文档,并返回剩余的文档

管道聚合

 数据准备
c2=mydb['c2']
d3=[
    {"name":"张三","age":18,"sex":"男","major":"大数据技术"},
    {"name":"李四","age":19,"sex":"男",'major':"大数据技术"},
    {"name":"王五","age":18,"sex":"女","major":"人工智能"}
]
c2.insert_many(d3)

 

for d in c2.find():
    print(d)

 

聚合查询  

 语法格式:

集合.aggregate.([
{"$管道1":{表达式}},
{"$管道2":{表达式}},
...
])

 例如:按major进行分组,统计每个分组中的年龄平均值

#按major进行分组,统计每个分组中的年龄平均值
piple=[{
    "$group":{"_id":"$major","avg_age":{"$avg":"$age"}}
}]
x=c2.aggregate(piple)
for i in x:
    print(i)

{'_id': '人工智能', 'avg_age': 18.0}
{'_id': '大数据技术', 'avg_age': 18.5}
#按住major进行分组,统计每个分组中的年龄平均值和计数,并按照平均年龄降序排序
piple2=[
    { "$group":{"_id":"$major","avg_age":{"$avg":"$age"},"count":{"$sum":1}}},
    {"$sort":{"avg_age":-1}}
]
x=c2.aggregate(piple2)
for i in x:
    print(i)
{'_id': '大数据技术', 'avg_age': 18.5, 'count': 2}
{'_id': '人工智能', 'avg_age': 18.0, 'count': 1}

文档更新

我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。

for d in c2.find():
    print(d)
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 18, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 19, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb493'), 'name': '王五', 'age': 18, 'sex': '女', 'major': '人工智能'}
#把王五文档sax字段修改为 男
q={"name":"王五"}#查询条件
n_d={"$set":{"sex":"男"}}#新数据

c2.update_one(q,n_d)#update_one修改匹配到的第一个文档

for d in c2.find():
    print(d)
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 18, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 19, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb493'), 'name': '王五', 'age': 18, 'sex': '男', 'major': '人工智能'}

 update_many为修改多个文档方法,只要条件匹配上则全部修改。例如

#把所有文档年龄全部增加2岁
c2.update_many({},{"$inc":{"age":2}})#同时修改多个文档 update_many
for d in c2.find():
    print(d)
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 20, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 21, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb493'), 'name': '王五', 'age': 20, 'sex': '男', 'major': '人工智能'}

更多更新方法【修改器】请查看:MongoDB基本操作(一)-CSDN博客 

删除文档 

for d in c2.find():
    print(d)
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 20, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 21, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb493'), 'name': '王五', 'age': 20, 'sex': '男', 'major': '人工智能'}

 我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

#删除姓名为 王五的文档
c2.delete_one({"name":"王五"})#删除单个
<pymongo.results.DeleteResult at 0x2049fe8bc88>
for d in c2.find():
    print(d)
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 20, 'sex': '男', 'major': '大数据技术'}
{'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 21, 'sex': '男', 'major': '大数据技术'}

 我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

c2.delete_many({"major":"大数据技术"})#删除多个,如果删除全部,则条件为空
for d in c2.find():
    print(d)

delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档。

其他

dos=mycoll.find()
for i in dos:
    print(i)

 

限制返回数limit 

#查询限制返回数 limit,只返回前5个文档
for i in mycoll.find().limit(5):
    print(i)

 

排序sort 

 

#排序sort,第一个参数为排序字段,参数2为排序方法,按照年龄进行降序排序
for i in mycoll.find().sort("age",-1):
    print(i)

 

 跳过指定数量的文档 skip

#跳过指定数量的文档 skip,返回剩下的文档
for i in mycoll.find().skip(8):
    print(i)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值