浅析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数据库之间的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!