引入库文件
import pymongo
如果没有安装库,可以pip install pymongo 进行安装
链接数据库
#连接数据库,指定ip和端口
myclient=pymongo.MongoClient('localhost',27017)
查看数据和集合
#查看数据库
dbs=myclient.list_database_names()
dbs
['admin', 'c4', 'config', 'local', 'student']
# 切换/创建(本身不存在)数据库
mydb=myclient['test']#切换到数据库test
#查看test数据库中的所有集合
cols=mydb.list_collection_names()
cols
[]
#直接切换/创建集合
c1=mydb['cl']
#显示创建,删除集合
mydb.create_collection("c2")
mydb.drop_collection("c2")
{'nIndexesWas': 1, 'ns': 'test.c2', 'ok': 1.0}
文档的增删改查
myclient=pymongo.MongoClient('localhost',27017)
mydb=myclient['test']#切换到数据库test
c1=mydb['cl']
for i in c1.find():
print(i)
增
单文档插入 insert_one
d1={"name":"kjfd","age":18,"major":"大数据技术"}#在python中,key(字段)必须用双(单括号括起来)
x=c1.insert_one(d1)
print(x.inserted_id)#打印_id
664c48ead621b3402bf1c191
#查询c1文档
for i in c1.find():
print(i)
{'_id': ObjectId('664c48d6d621b3402bf1c190'), 'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
多文档插入inssert_many
#多文档插入,参数为列表(数组)
d2=[
{"name":"jasgdk","age":14,"major":"大数据技术"},
{"name":"456","age":48,"major":"大数据技术"},
{"name":"789","age":20,"major":"人工智能"}
]
x=c1.insert_many(d2)
print(x.inserted_ids)#打印多文档_id
[ObjectId('664c4a60d621b3402bf1c198'), ObjectId('664c4a60d621b3402bf1c199'), ObjectId('664c4a60d621b3402bf1c19a')]
查
#按条件查询c1文档
#find()第一个参数为查询条件,第二个参数为(不)显示的列
for i in c1.find({"major":"大数据技术"},{"_id":0}):
print(i)
File "<ipython-input-43-79005252b841>", line 3
for i in c1.find({"major":"大数据技术"},{"_id":0}):
^
SyntaxError: invalid character in identifier
#按修饰符(运算)进行查询
q={"age":{"$gt":20}}#查询条件,age大于20
for i in c1.find(q,{"_id":0}):
print(i)
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
#正则匹配,$regex,查询name以k开头的所有文档
q1={"name":{"$regex":"^k"}}
for i in c1.find(q1,{"_id":0}):
print(i)
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
管道查询
pin=[
{"$group":{"_id":"$major","max_age":{"$max":"$age"}}}
]
result=c1.aggregate(pin)
for i in result:
print(i)
{'_id': '人工智能', 'max_age': 20}
{'_id': '大数据技术', 'max_age': 48}
按照major分组,统计年龄平均值,并统计每个分组文档数,按照平均年龄降序排序
pin1=[
{"$group":{"_id":"$major","avg_age":{"$avg":"$age"},"count":{"$sum":1}}},
{"$sort":{"avg_age":-1}}
]
result=c1.aggregate(pin1)
for i in result:
print(i)
{'_id': '大数据技术', 'avg_age': 27.75, 'count': 8}
{'_id': '人工智能', 'avg_age': 20.0, 'count': 3}
改
更新单个文档uppdate_one
for d in c1.find():
print(d)
{'_id': ObjectId('664c48d6d621b3402bf1c190'), 'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'_id': ObjectId('664c48ead621b3402bf1c191'), 'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'_id': ObjectId('664c4a45d621b3402bf1c192'), 'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'_id': ObjectId('664c4a45d621b3402bf1c193'), 'name': '456', 'age': 48, 'major': '大数据技术'}
{'_id': ObjectId('664c4a45d621b3402bf1c194'), 'name': '789', 'age': 20, 'major': '人工智能'}
{'_id': ObjectId('664c4a52d621b3402bf1c195'), 'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'_id': ObjectId('664c4a52d621b3402bf1c196'), 'name': '456', 'age': 48, 'major': '大数据技术'}
{'_id': ObjectId('664c4a52d621b3402bf1c197'), 'name': '789', 'age': 20, 'major': '人工智能'}
{'_id': ObjectId('664c4a60d621b3402bf1c198'), 'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'_id': ObjectId('664c4a60d621b3402bf1c199'), 'name': '456', 'age': 48, 'major': '大数据技术'}
{'_id': ObjectId('664c4a60d621b3402bf1c19a'), 'name': '789', 'age': 20, 'major': '人工智能'}
#name为aa3的文档,年龄改为77,$set--修改列值
c1.update_one({"name":"aa3"},{"$set":{"age":77}})
for d in c1.find({"name":"aa3"},{"_id":0}):
print(d)
q={"nmajor":"大数据技术"}
n_d={"$inc":{"$age":5}}
c1.update_many(q,n_d)
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
删
删除单个文档 --delete one:删除匹配的第一个文档
#删除name为aa2的文档
c1.delete_one({"name":"aa2"})
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
删除多个文档–delete_many:闪出所有匹配上的文档
#删除name以k开头的文档,需要使用正则表达式匹配
c1.delete_many({"name":{"$regex":"^k"}})
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
删除所有文档——delete_many–查询条件为空即可
其他
# 排序--sort()
for i in c1.find({},{"_id":0}).sort("age",1):
print(i)
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
for i in c1.find({},{"_id":0}).limit(1):
print(i)
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
#跳过--skip():跳过指定文档数,返回剩下的文档
for i in c1.find({},{"_id":0}).skip(2):
print(i)
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}
{'name': 'jasgdk', 'age': 14, 'major': '大数据技术'}
{'name': '456', 'age': 48, 'major': '大数据技术'}
{'name': '789', 'age': 20, 'major': '人工智能'}