库引入
In [3]:
import pymongo
链接
In [5]:
myclient=pymongo.MongoClient("localhost",27017)#连接数据库
查看数据库和集合
In [6]:
dbs=myclient.list_database_names()#查看所有数据库
dbs
Out[6]:
运行结果:
['admin', 'config', 'local', 'test']
In [7]:
mydb=myclient['test']#切换/创建(不存在的时候)数据库test
In [9]:
colls=mydb.list_collection_names()#查看/罗列集合名
#colls
mycoll=mydb['c1']#切换/显示创建(不存在的时候)集合
文档增删改查
查看文档
In [10]:
myclient=pymongo.MongoClient("localhost",27017)#链接服务
mydb=myclient['test']#选择数据库
mycoll=mydb['c1']#选择集合
docs=mycoll.find()#查看文档
#打印文档
for i in docs:
print(i)
运行结果:
插入文档
In [14]:
d1={"name":"hakgd","age":88,"major":"大数据"}#python中key也需要使用引号括起来
x=mycoll.insert_one(d1)#插入单个文档insert_one
print(x.inserted_id)#打印文档_id
运行结果:
In [18]:
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
运行结果:
[ObjectId('664bff1b32a3dbc8cddeb48e'), ObjectId('664bff1b32a3dbc8cddeb48f'), ObjectId('664bff1b32a3dbc8cddeb490')]
In [19]:
dos=mycoll.find()
for i in dos:
print(i)
运行结果:
{'_id': ObjectId('664bef6e3dceef39a819193e'), 'name': 'aa1', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a819193f'), 'name': 'aa2', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a8191940'), 'name': 'aa4', 'age': 20.0} {'_id': ObjectId('664bef6e3dceef39a8191941'), 'name': 'aa5', 'age': 17.0} {'_id': ObjectId('664bfd6532a3dbc8cddeb484'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe1132a3dbc8cddeb485'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3032a3dbc8cddeb486'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3b32a3dbc8cddeb487'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfeff32a3dbc8cddeb488'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bfeff32a3dbc8cddeb489'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bfeff32a3dbc8cddeb48a'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff0e32a3dbc8cddeb48b'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff0e32a3dbc8cddeb48c'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff0e32a3dbc8cddeb48d'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff1b32a3dbc8cddeb48e'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff1b32a3dbc8cddeb48f'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff1b32a3dbc8cddeb490'), 'name': 'uixz', 'age': 100}
In [20]:
dos=mycoll.find({"age":88},{"_id":0})#find的使用和mongodb一致,第一个参数为查询条件,参数2为(不)显示的列
for i in dos:
print(i)
运行结果:
{'name': 'hakgd', 'age': 88, 'major': '大数据'} {'name': 'hakgd', 'age': 88, 'major': '大数据'} {'name': 'hakgd', 'age': 88, 'major': '大数据'} {'name': 'hakgd', 'age': 88, 'major': '大数据'} {'name': 'vkjz', 'age': 88} {'name': 'vkjz', 'age': 88} {'name': 'vkjz', 'age': 88}
In [22]:
dos=mycoll.find({"age":{"$lt":20}},{"_id":0})#find的使用和mongodb一致,第一个参数为查询条件,参数2为(不)显示的列
for i in dos:
print(i)
运行结果:
{'name': 'aa1', 'age': 18.0} {'name': 'aa2', 'age': 18.0} {'name': 'aa5', 'age': 17.0}
In [23]:
dos=mycoll.find({"name":{"$regex":"^a"}},{"_id":0})#,第一个参数为查询条件,正则匹配name为a开头的文档
for i in dos:
print(i)
运行结果:
{'name': 'aa1', 'age': 18.0} {'name': 'aa2', 'age': 18.0} {'name': 'aa4', 'age': 20.0} {'name': 'aa5', 'age': 17.0} {'name': 'aklgd', 'age': 44} {'name': 'aklgd', 'age': 44} {'name': 'aklgd', 'age': 44}
In [24]:
c2=mydb['c2']
d3=[
{"name":"张三","age":18,"sex":"男","major":"大数据技术"},
{"name":"李四","age":19,"sex":"男",'major':"大数据技术"},
{"name":"王五","age":18,"sex":"女","major":"人工智能"}
]
c2.insert_many(d3)
Out[24]:
运行结果:
<pymongo.results.InsertManyResult at 0x2049c49f470>
In [25]:
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': '人工智能'}
聚合查询
In [28]:
#按住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}
In [30]:
#按住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}
文档更新
In [31]:
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': '人工智能'}
In [32]:
#把王五文档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': '人工智能'}
In [33]:
#把所有文档年龄全部增加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': '人工智能'}
删除文档
In [34]:
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': '人工智能'}
In [35]:
#删除姓名为 王五的文档
c2.delete_one({"name":"王五"})#删除单个
Out[35]:
运行结果:
<pymongo.results.DeleteResult at 0x2049fe8bc88>
In [36]:
for d in c2.find():
print(d)
运行结果:
{'_id': ObjectId('664c044a32a3dbc8cddeb491'), 'name': '张三', 'age': 20, 'sex': '男', 'major': '大数据技术'} {'_id': ObjectId('664c044a32a3dbc8cddeb492'), 'name': '李四', 'age': 21, 'sex': '男', 'major': '大数据技术'}
In [37]:
c2.delete_many({"major":"大数据技术"})#删除多个,如果删除全部,则条件为空
for d in c2.find():
print(d)
其他
In [38]:
dos=mycoll.find()
for i in dos:
print(i)
运行结果:
{'_id': ObjectId('664bef6e3dceef39a819193e'), 'name': 'aa1', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a819193f'), 'name': 'aa2', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a8191940'), 'name': 'aa4', 'age': 20.0} {'_id': ObjectId('664bef6e3dceef39a8191941'), 'name': 'aa5', 'age': 17.0} {'_id': ObjectId('664bfd6532a3dbc8cddeb484'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe1132a3dbc8cddeb485'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3032a3dbc8cddeb486'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3b32a3dbc8cddeb487'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfeff32a3dbc8cddeb488'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bfeff32a3dbc8cddeb489'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bfeff32a3dbc8cddeb48a'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff0e32a3dbc8cddeb48b'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff0e32a3dbc8cddeb48c'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff0e32a3dbc8cddeb48d'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff1b32a3dbc8cddeb48e'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff1b32a3dbc8cddeb48f'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff1b32a3dbc8cddeb490'), 'name': 'uixz', 'age': 100}
In [39]:
#查询限制返回数 limit,只返回前5个文档
for i in mycoll.find().limit(5):
print(i)
{'_id': ObjectId('664bef6e3dceef39a819193e'), 'name': 'aa1', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a819193f'), 'name': 'aa2', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a8191940'), 'name': 'aa4', 'age': 20.0} {'_id': ObjectId('664bef6e3dceef39a8191941'), 'name': 'aa5', 'age': 17.0} {'_id': ObjectId('664bfd6532a3dbc8cddeb484'), 'name': 'hakgd', 'age': 88, 'major': '大数据'}
In [41]:
#排序sort,第一个参数为排序字段,参数2为排序方法,按照年龄进行降序排序
for i in mycoll.find().sort("age",-1):
print(i)
运行结果:
{'_id': ObjectId('664bfeff32a3dbc8cddeb48a'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff0e32a3dbc8cddeb48d'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff1b32a3dbc8cddeb490'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bfd6532a3dbc8cddeb484'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe1132a3dbc8cddeb485'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3032a3dbc8cddeb486'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfe3b32a3dbc8cddeb487'), 'name': 'hakgd', 'age': 88, 'major': '大数据'} {'_id': ObjectId('664bfeff32a3dbc8cddeb489'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff0e32a3dbc8cddeb48c'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff1b32a3dbc8cddeb48f'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bfeff32a3dbc8cddeb488'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff0e32a3dbc8cddeb48b'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff1b32a3dbc8cddeb48e'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bef6e3dceef39a8191940'), 'name': 'aa4', 'age': 20.0} {'_id': ObjectId('664bef6e3dceef39a819193e'), 'name': 'aa1', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a819193f'), 'name': 'aa2', 'age': 18.0} {'_id': ObjectId('664bef6e3dceef39a8191941'), 'name': 'aa5', 'age': 17.0}
In [42]:
#跳过指定数量的文档 skip,返回剩下的文档
for i in mycoll.find().skip(8):
print(i)
运行结果:
{'_id': ObjectId('664bfeff32a3dbc8cddeb488'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bfeff32a3dbc8cddeb489'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bfeff32a3dbc8cddeb48a'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff0e32a3dbc8cddeb48b'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff0e32a3dbc8cddeb48c'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff0e32a3dbc8cddeb48d'), 'name': 'uixz', 'age': 100} {'_id': ObjectId('664bff1b32a3dbc8cddeb48e'), 'name': 'aklgd', 'age': 44} {'_id': ObjectId('664bff1b32a3dbc8cddeb48f'), 'name': 'vkjz', 'age': 88} {'_id': ObjectId('664bff1b32a3dbc8cddeb490'), 'name': 'uixz', 'age': 100}