浅析Python与Mongodb数据库之间的操作方法
MongoDB是目前最流行的NoSQL数据库之一,使用的数据类型BSON(类似JSON)。
1.安装Mongodb和pymongo
Mongodb的安装和配置
Mongodb的安装教程请网上搜索,安装完成后, 进行以下配置过程:
1.1创建目录,该目录为Mongodb数据文件的存放目录:
*注:本人使用的不是root用户,所以修改目录的拥有者.*
sudomkdir/data sudochown-Rpython:python/data mkdir/data/db
1.2分别执行命令:
第一条命令为指定端口和保存路径,第二条为运行mongodb数据库.
mongod--port27017--dbpath/data/db mongo--port27017
1.3安装pymongo
sudopip3installpymongo
2.连接数据库、指定数据库、指定集合、插入数据:
mongodb存储数据以键值形式,因此在Python中使用字段插入数据.
importpymongo
#连接mongodb
client=pymongo.MongoClient('mongodb://localhost:27017/')
#指定数据库
db=client.test4
#指定集合
collection=db.students
#数据
student1={
'id':'201801',
'name':'Jack',
'age':20,
'gender':'male'
}
student2={
'id':'201802',
'name':'Tom',
'age':22,
'gender':'male'
}
student3={
'id':'201803',
'name':'Rose',
'age':21,
'gender':'female'
}
student4={
'id':'201804',
'name':'Mike',
'age':20,
'gender':'female'
}
student5={
'id':'201805',
'name':'Ray',
'age':20,
'gender':'female'
}
student6={
'id':'201806',
'name':'Alan',
'age':21,
'gender':'male'
}
#插入一条数据
result1=collection.insert_one(student1)
print(result1)
print(result1.inserted_id)
##插入多条数据
result2=collection.insert_many([student2,student3,student4,student5,student6])
print(result2)
print(result2.inserted_ids)
运行结果:
insert方法:
5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'),ObjectId('5b3a1942971951218d41c02d')]
官方推荐:
5b3a1942971951218d41c02e [ObjectId('5b3a1942971951218d41c02f'),ObjectId('5b3a1942971951218d41c030')]
3.查询、计数、排序、偏移:
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#查询一条数据
print('单条数据','='*50)
result=collection.find_one({'name':'Jack'})
print(result)
print('多条数据','='*50)
#查询多条数据
forresincollection.find({'age':{'$mod':[5,0]}}):
print(res)
#计数
print('计数','='*50)
count=collection.find({'age':{'$mod':[5,0]}}).count()
print(count)
#排序
print('排序','='*50)
results=collection.find().sort('name',pymongo.ASCENDING)#升序,pymongo.DESCENDING为降序
print([result['name']forresultinresults])
#偏移
print('偏移','='*50)
results=collection.find().sort('name',pymongo.ASCENDING).skip(2)#偏移2位,忽略前两个数据
print([result['name']forresultinresults])
results=collection.find().sort('name',pymongo.ASCENDING).skip(2).limit(2)#只输出2个数据
print([result['name']forresultinresults])
find({‘age':{'$mod':[5,0]}}):表示查找年龄取余5余0的值.还有很多比较符号,请百度.
运行结果:
单条数据==================================================
{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':20,'gender':'male'}
多条数据==================================================
{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':20,'gender':'male'}
{'_id':ObjectId('5b3a1942971951218d41c02e'),'id':'201804','name':'Mike','age':20,'gender':'female'}
{'_id':ObjectId('5b3a1942971951218d41c02f'),'id':'201805','name':'Ray','age':20,'gender':'female'}
计数==================================================
3
排序==================================================
['Alan','Jack','Mike','Ray','Rose','Tom']
偏移==================================================
['Mike','Ray','Rose','Tom']
['Mike','Ray']
4.更新:
4.1 不使用$set更新数据:
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#修改
condition={'name':'Jack'}
student=collection.find_one(condition)#获得满足condition的数据
print('更新前:',student)
student['age']=22#修改年龄
result=collection.update(condition,student)#将修改后的student替换condition
print('更新后',collection.find_one(condition))
#更新的返回值
print(result)#ok=1代表执行成功,nModified代表影响的条数
运行结果:
更新前:{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':20,'gender':'male'}
更新后{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':22,'gender':'male'}
{'ok':1,'nModified':1,'n':1,'updatedExisting':True}
4.2 使用$set更新数据:
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#使用$set更新
condition={'name':'Jack'}
student=collection.find_one(condition)#获得满足condition的数据
print('更新前:',student)
student['age']=23#修改年龄
result=collection.update(condition,{'$set':student})#将修改后的student替换condition,$set为重点
print('更新后',collection.find_one(condition))
#更新的返回值
print(result)#ok=1代表执行成功,nModified代表影响的条数
运行结果:
更新前:{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':22,'gender':'male'}
更新后{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':23,'gender':'male'}
{'ok':1,'nModified':1,'n':1,'updatedExisting':True}
比较使用和不适用$set更新数据,发现此时并没有什么区别.
下面介绍区别所在:
4.3 区别
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#使用和不使用$set更新的区别
print('使用:')
condition={'name':'Jack'}
student=collection.find_one(condition)#获得满足condition的数据
print('更新前:',student)
student={
'id':'201803',
'name':'Jack',
'age':20,
'gender':'female',
'mother':"Jack'smother"
}
result=collection.update(condition,{'$set':student})#将修改后的student替换condition
print('更新后',collection.find_one(condition))
#更新的返回值
print(result)#ok=1代表执行成功,nModified代表影响的条数
#分割线
print()
print('='*20,'分割线','='*20)
print()
print('不使用:')
condition={'name':'Jack'}
student=collection.find_one(condition)#获得满足condition的数据
print('更新前:',student)
student={
'id':'201803',
'name':'Jack',
'age':20,
'gender':'female',
'father':"Jack'sfather"
}
result=collection.update(condition,student)#将修改后的student替换condition
print('更新后',collection.find_one(condition))
#更新的返回值
print(result)#ok=1代表执行成功,nModified代表影响的条数
运行结果:
使用:
更新前:{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201801','name':'Jack','age':23,'gender':'male'}
更新后{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201803','name':'Jack','age':20,'gender':'female','mother':"Jack'smother"}
{'ok':1,'nModified':1,'n':1,'updatedExisting':True}
====================分割线====================
不使用:
更新前:{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201803','name':'Jack','age':20,'gender':'female','mother':"Jack'smother"}
更新后{'_id':ObjectId('5b3a1942971951218d41c02b'),'id':'201803','name':'Jack','age':20,'gender':'female','father':"Jack'sfather"}
{'ok':1,'nModified':1,'n':1,'updatedExisting':True}
分析上面运行结果,可以发现使用$set时,若更新数据有原数据没有的字段,则将该字段加到原数据上(上例为新增了mother字段),而不会删除任何字段.相反,若不使用set时,将从原数据中删除更新数据没有的字段,再加上新增字段(上例为删除了mother字段,新增了father字段.也可以理解为将原数据完全替换为更新数据)
4.4 update_one和update_many的区别:
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#官方推荐使用
#update_one和update_many的区别
print('update_one:')
condition={'age':{'$gt':20}}
result=collection.update_one(condition,{'$inc':{'age':1}})
print(result)
print(result.matched_count,result.modified_count)
#分割线
print()
print('='*20,'分割线','='*20)
print()
print('update_many:')
condition={'age':{'$gt':20}}
result=collection.update_many(condition,{'$inc':{'age':1}})
print(result)
print(result.matched_count,result.modified_count)
运行结果:
update_one:11 ====================分割线==================== update_many: 33 12345678910 {‘age':{'$gt':20}}为查找年龄大于20的,{‘inc':{‘age':1}}为将年龄+1
5.删除:
importpymongo
frombson.objectidimportObjectId
client=pymongo.MongoClient('mongodb://localhost:27017/')
db=client.test4
collection=db.students
#删除
result=collection.remove({'name':'Jack'})
print(result)
#推荐使用
result=collection.delete_one({'age':{'$gt':20}})
print(result.deleted_count)
result=collection.delete_many({'age':{'$gt':20}})
print(result.deleted_count)
运行结果:
{'ok':1,'n':1}
1
2
6.其他
除了上述常用的之外,还包括find_one_and_delete()查找后删除、find_one_and_replace()查找后替换,有兴趣可以百度深入了解.
总结
以上所述是小编给大家介绍的Python与Mongodb数据库之间的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!