运用Mongodb在jupyter notebook写带代码
在jupyter中写要确认好环境变量,例如Python3环境
以下是代码:
import pymongo
#连接数据库,指定ip和端口
myclient=pymongo.MongoClient('localhost',27017)
查看数据库和集合
#查看数据库
dbs=myclient.list_database_names()
dbs
['admin', 'config', 'local', 'test']
#切换/创建(本身不存在)数据库
mydb=myclient['test']#切换到数据库test
#查看test数据库中的所有集合
cols=mydb.list_collection_names()
cols
['c1']
#直接切换/创建集合
c1=mydb['c1']
#显示创建、删除集合
c2=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['c1']
for i in c1.find():
print(i)
{'_id': ObjectId('664c3b389a8c9442c780515e'), 'name': 'aa1', 'age': 88.0}
{'_id': ObjectId('664c3b389a8c9442c780515f'), 'name': 'aa2', 'age': 99.0}
{'_id': ObjectId('664c3b389a8c9442c7805160'), 'name': 'aa3', 'age': 100.0}
增
单文档插入insert_one
d1={"name":"牢底","age":18,"major": "大数据技术"}
x=c1.insert_one(d1)
print(x.inserted_id)
664c484eadfcd97ffeaf043a
#查询c1文档
for i in c1.find():
print(i)
{'_id': ObjectId('664c3b389a8c9442c780515e'), 'name': 'aa1', 'age': 88.0}
{'_id': ObjectId('664c3b389a8c9442c780515f'), 'name': 'aa2', 'age': 99.0}
{'_id': ObjectId('664c3b389a8c9442c7805160'), 'name': 'aa3', 'age': 100.0}
{'_id': ObjectId('664c484eadfcd97ffeaf043a'), 'name': '牢底', 'age': 18, 'major': '大数据技术'}
多文档插入insert_many
#多文档插入,参数为列表(数组)
d2=[
{"name":"郭靖","age":21,"major":"降龙十八掌"},
{"name":"黄蓉","age":20,"major":"打狗棒法"},
{"name":"扫地僧","age":41,"major":"罗汉伏魔功"}
]
x=c1.insert_many(d2)
print(x.inserted_ids)#打印多文档_id
[ObjectId('664c49a2adfcd97ffeaf043b'), ObjectId('664c49a2adfcd97ffeaf043c'), ObjectId('664c49a2adfcd97ffeaf043d')]
for i in c1.find():
print(i)
{'_id': ObjectId('664c3b389a8c9442c780515e'), 'name': 'aa1', 'age': 88.0}
{'_id': ObjectId('664c3b389a8c9442c780515f'), 'name': 'aa2', 'age': 99.0}
{'_id': ObjectId('664c3b389a8c9442c7805160'), 'name': 'aa3', 'age': 100.0}
{'_id': ObjectId('664c484eadfcd97ffeaf043a'), 'name': '牢底', 'age': 18, 'major': '大数据技术'}
{'_id': ObjectId('664c49a2adfcd97ffeaf043b'), 'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'_id': ObjectId('664c49a2adfcd97ffeaf043c'), 'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'_id': ObjectId('664c49a2adfcd97ffeaf043d'), 'name': '扫地僧', 'age': 41, 'major': '罗汉伏魔功'}
查
#按条件查询c1文档
#find()第一个参数为查询条件,第二个参数为(不)显示的列
for i in c1.find({"major":"罗汉伏魔功"},{"_id":0}):
print(i)
{'name': '扫地僧', 'age': 41, 'major': '罗汉伏魔功'}
#按修饰符进行查询
q={"age":{"$gt":18}}# 查询条件,age大于18
for i in c1.find(q,{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa2', 'age': 99.0}
{'name': 'aa3', 'age': 100.0}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 41, 'major': '罗汉伏魔功'}
#正则匹配$regex,查询name以a开头的所有文档
q1={"name":{"$regex":"^a"}}
for i in c1.find(q1,{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa2', 'age': 99.0}
{'name': 'aa3', 'age': 100.0}
管道查询
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa2', 'age': 99.0}
{'name': 'aa3', 'age': 100.0}
{'name': '牢底', 'age': 18, 'major': '大数据技术'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 41, 'major': '罗汉伏魔功'}
#在python中管道必须为list形式,所以要用[括起来]
pin=[
{"$group":{"_id":"$major","max_age":{"$max":"$age"}}}
]
#返回结果为列表,循环打印
result=c1.aggregate(pin)
for i in c1.aggregate(pin):
print(i)
{'_id': '打狗棒法', 'max_age': 20}
{'_id': '罗汉伏魔功', 'max_age': 41}
{'_id': '大数据技术', 'max_age': 18}
{'_id': '降龙十八掌', 'max_age': 21}
{'_id': None, 'max_age': 100.0}
按照major分组,统计年龄平均值,并统计每个分组文档数,按照平均年龄降序排序
pinl=[
{"$group":{"_id":"$major","avg_age":{"$avg":"$age"},"count":{"$sum":1}}},
{"$sort":{"avg_age":-1}}
]
result=c1.aggregate(pinl)
for i in result:
print(i)
{'_id': None, 'avg_age': 95.66666666666667, 'count': 3}
{'_id': '罗汉伏魔功', 'avg_age': 41.0, 'count': 1}
{'_id': '降龙十八掌', 'avg_age': 21.0, 'count': 1}
{'_id': '打狗棒法', 'avg_age': 20.0, 'count': 1}
{'_id': '大数据技术', 'avg_age': 18.0, 'count': 1}
改(更新
更新单个文档update_one
c1=mydb['c1']
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa2', 'age': 99.0}
{'name': 'aa3', 'age': 100.0}
{'name': '牢底', 'age': 18, 'major': '大数据技术'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 41, 'major': '罗汉伏魔功'}
#name为aa3的文档,年龄改为43,$set--修改列值
c1.update_one({"name":"扫地僧"},{"$set":{"age":43}})#第一个参数为查询条件,参数2为修改表达式
#查询验证
for i in c1.find({"name":"扫地僧"},{"_id":0}):
print(i)
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}
更新多个文档updata_many:更新找到的所有的文档
#更新major为大数据技术的文档中的年龄字段,全部加1岁--$inc
q={"major":"大数据技术"}#条件
n_d={"$inc":{"age":1}}#新数据
c1.update_many(q,n_d)
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa2', 'age': 99.0}
{'name': 'aa3', 'age': 100.0}
{'name': '牢底', 'age': 19, 'major': '大数据技术'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}
删
删除单个文档–delete_one:删除匹配上的第一个文档
#删除name为aa2的文档
c1.delete_one({"name":"aa2"})#参数为匹配条件
for i in c1.find({},{"_id":0}):
print(i)
{'name': 'aa1', 'age': 88.0}
{'name': 'aa3', 'age': 100.0}
{'name': '牢底', 'age': 19, 'major': '大数据技术'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}
删除多个文档–delet_many:删除所有匹配上的文档
#删除name以开头的文档,需要使用正则表达式匹配
c1.delete_many({"name":{"$regex":"^a"}})
for i in c1.find({},{"_id":0}):
print(i)
{'name': '牢底', 'age': 19, 'major': '大数据技术'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}
删除所有文档–delete many–查询条件为空即可
其他
#排序--sort():按照年龄进行升序排序
for i in c1.find({},{"_id":0}).sort("age",1):
print(i)
{'name': '牢底', 'age': 19, 'major': '大数据技术'}
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '郭靖', 'age': 21, 'major': '降龙十八掌'}
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}
#限制返回数--limit():只返回指定个数的文档
for i in c1.find({},{"_id":0}).limit(1):
print(i)
{'name': '牢底', 'age': 19, 'major': '大数据技术'}
#跳过--skip():跳过指定的文档数,返回剩下的文档
for i in c1.find({},{"_id":0}).skip(2):
print(i)
{'name': '黄蓉', 'age': 20, 'major': '打狗棒法'}
{'name': '扫地僧', 'age': 43, 'major': '罗汉伏魔功'}