使用python链接mongo数据库
引入数据库
import pymongo
链接数据库
#连接数据库,指定ip和端口
myclient=pymongo.MongoClient('localhost',27017)
查看数据库和集合
#查看数据库list_database_names
dbs=myclient.list_database_names()
dbs
['admin', 'config', 'local', 'test']
#切换/创建(本身不存在)数据库
mydb=myclient['test']#切换到数据库test
#查看test数据库中的所有集合
cols=mydb.list_collection_names()
cols
['items']
#直接切换/创建集
items=mydb['items']
#显示创建、删除集合
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
items=mydb['items']
#打印文档
for i in items.find():
print(i)
{'_id': ObjectId('664c3ddeffd2d0f9dc009503'), 'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009504'), 'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009505'), 'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009506'), 'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009507'), 'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009508'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009509'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc00950a'), 'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
增
单文档插入insert_one
d1={"name":"kjfd","age":18,"major":"大数据技术"}#在pyhton中,key(字段)必须用双引号括起来
x=items.insert_one(d1)
print(x.inserted_id)#打印id
664c4882d8456b5efc51706f
#查询items文档
for i in items.find():
print(i)
{'_id': ObjectId('664c3ddeffd2d0f9dc009503'), 'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009504'), 'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009505'), 'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009506'), 'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009507'), 'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009508'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009509'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc00950a'), 'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c4882d8456b5efc51706f'), 'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
多文档插入insert_manyinsert_many
#多文档插入,参数为列表(数组)
d2=[
{"name":"jasgdkj","age":14,"major":"大数据技术"},
{"name":"kadh","age":49,"major":"大数据技术"},
{"name":"kagd","age":48,"major":"人工智能"}
]
x=items.insert_many(d2)
print(x.inserted_ids)#打印多文档id
[ObjectId('664c49cbd8456b5efc517070'), ObjectId('664c49cbd8456b5efc517071'), ObjectId('664c49cbd8456b5efc517072')]
#查询items文档
for i in items.find():
print(i)
{'_id': ObjectId('664c3ddeffd2d0f9dc009503'), 'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009504'), 'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009505'), 'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009506'), 'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009507'), 'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009508'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'_id': ObjectId('664c3ddeffd2d0f9dc009509'), 'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'_id': ObjectId('664c3ddeffd2d0f9dc00950a'), 'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'_id': ObjectId('664c4882d8456b5efc51706f'), 'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'_id': ObjectId('664c49cbd8456b5efc517070'), 'name': 'jasgdkj', 'age': 14, 'major': '大数据技术'}
{'_id': ObjectId('664c49cbd8456b5efc517071'), 'name': 'kadh', 'age': 49, 'major': '大数据技术'}
{'_id': ObjectId('664c49cbd8456b5efc517072'), 'name': 'kagd', 'age': 48, 'major': '人工智能'}
查
#按条件查询items文档
#find()第一个参数为查询条件,第二个参数为(不)显示的列
for i in items.find({"major":"大数据技术"},{"_id":0}):
print(i)
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'jasgdkj', 'age': 14, 'major': '大数据技术'}
{'name': 'kadh', 'age': 49, 'major': '大数据技术'}
#按修饰符进行查询
q={"age":{"$gt":20}}#查询条件 age大于20
for i in items.find(q,{"_id":0}):
print(i)
{'name': 'kadh', 'age': 49, 'major': '大数据技术'}
{'name': 'kagd', 'age': 48, 'major': '人工智能'}
#正侧匹配$regex,查询name以k开头的所有文档
q1={"name":{"$regex":"^k"}}
for i in items.find(q1,{"_id":0}):
print(i)
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'kadh', 'age': 49, 'major': '大数据技术'}
{'name': 'kagd', 'age': 48, 'major': '人工智能'}
管道查询
for i in items.find({},{"_id":0}):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'jasgdkj', 'age': 14, 'major': '大数据技术'}
{'name': 'kadh', 'age': 49, 'major': '大数据技术'}
{'name': 'kagd', 'age': 48, 'major': '人工智能'}
#在python中管道必须为list形式,所以要用[括起来]
pin=[
{"$group":{"_id":"$major","max_age":{"$max":"$age"}}}
]
#返回结果为列表,循环打印
result=items.aggregate(pin)
for i in result:
print(i)
{'_id': '人工智能', 'max_age': 48}
{'_id': None, 'max_age': None}
{'_id': '大数据技术', 'max_age': 49}
按照major分组,统计年龄平均值,并统计每个分组文档数,按照平均年龄降序排序
pin1=[
{"$group":{"_id":"$major","avg_age":{"$avg":"$age"},"count":{"$sum":1}}},
{"$sort":{"avg_age":-1}}
]
#返回结果为列表,循环打印
result=items.aggregate(pin1)
for i in result:
print(i)
{'_id': '人工智能', 'avg_age': 48.0, 'count': 1}
{'_id': '大数据技术', 'avg_age': 27.0, 'count': 3}
{'_id': None, 'avg_age': None, 'count': 8}
改 (更新)
更新单个文档update_one
items=mydb['items']
for d in items.find({},{"_id":0}):
print(d)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'kjfd', 'age': 18, 'major': '大数据技术'}
{'name': 'jasgdkj', 'age': 14, 'major': '大数据技术'}
{'name': 'kadh', 'age': 49, 'major': '大数据技术'}
{'name': 'kagd', 'age': 48, 'major': '人工智能'}
#name为aa3的文档,年龄改为77,$set--修改列值
items.update_one({"name":"aa3"},{"$set":{"age":77}})#第一个参数为查询条件,参数2为修改表达式
#查询验证
for d in items.find({"name":"aa3"},{"_id":0}):
print(d)
更新多个文档uodata_many:更新找到的所有文档
#更新多个文档major为大数据技术的文档中的年龄字段,全部加5岁--$inc
q={"major":"大数据技术"}#条件
n_d={"$inc":{"age":5}}#新数据
items.update_many(q,n_d)
for i in items.find({},{"_id":0}):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'kjfd', 'age': 23, 'major': '大数据技术'}
{'name': 'jasgdkj', 'age': 19, 'major': '大数据技术'}
{'name': 'kadh', 'age': 54, 'major': '大数据技术'}
{'name': 'kagd', 'age': 48, 'major': '人工智能'}
删
删除单个文档–delete_one:删除第一个匹配上的文档
#删除name为aa2的文档
items.delete_one({"name":"aa2"})#参数为匹配条件
for i in items.find({},{"_id":0}):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'jasgdkj', 'age': 19, 'major': '大数据技术'}
删除多个文档–deete_many:删除所有匹配上的文档
#删除name为k的文档
items.delete_many({"name":{"$regex":"^k"}})
for i in items.find({},{"_id":0}):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'jasgdkj', 'age': 19, 'major': '大数据技术'}
删除所有文档–delete_many–查询条件为空即可
其他
# 排序--sort()
for i in items.find({},{"_id":0}).sort("age",1):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
{'quantity': 2.0, 'price': 8.0, 'pnumber': 'p002'}
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'jasgdkj', 'age': 19, 'major': '大数据技术'}
#限制返回数--limit():只返回指定个数的文档
for i in items.find({},{"_id":0}).limit(1):
print(i)
{'quantity': 2.0, 'price': 5.0, 'pnumber': 'p003'}
#跳过--skip():跳过指定的文档数,返回剩下的文档
for i in items.find({},{"_id":0}).skip(2):
print(i)
{'quantity': 1.0, 'price': 4.0, 'pnumber': 'p002'}
{'quantity': 2.0, 'price': 4.0, 'pnumber': 'p001'}
{'quantity': 4.0, 'price': 10.0, 'pnumber': 'p003'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p001'}
{'quantity': 10.0, 'price': 20.0, 'pnumber': 'p003'}
{'quantity': 5.0, 'price': 10.0, 'pnumber': 'p002'}
{'name': 'jasgdkj', 'age': 19, 'major': '大数据技术'}