当前位置: 首页 > 科技观察

谈谈Python数据处理全家桶(MongoDB篇)

时间:2023-03-22 15:24:32 科技观察

本文转载自微信公众号《AirPython》,作者邢安国。转载本文请联系AirPython公众号.一、前言MongoDB是一个基于分布式存储,用C++编写的开源NoSql数据库。MongoDB的内容类似于JSON对象。数据结构一共有三种:Database-Databases对应关系数据库中的数据库集合-Collection对应关系数据库中的Table表(Table)文档-Document对应数据库表中的一条数据(RowData)Pymongo:通过JSON与MongoDB通信,将MongoDB数据映射成Python内置的数据类型首先,我们通过pip3命令安装依赖#installationdependencies#pymongopip3installpymongo#mongoenginepip3installmongoengine下面分别介绍Pymongo和Mongoengine3.PyMongo首先创建数据库连接对象创建数据库连接对象有两种方式,分别是:多参数,字符串拼接importpymongo#创建数据库连接对象的两种方式#方法一:多参数self.client=pymongo.MongoClient(host='ipaddress',port=27017,username="root",password="123456",authMechanism="SCRAM-SHA-1")#方法二:拼接#self.client=pymongo.MongoClient('mongodb://root:123456@ipaddress:27017/')然后通过数据库连接对象指定要操作的数据库和操作集。例如:要操作数据库temp中设置的学生#指定要操作的数据库:tempself.db=self.client.temp#指定要操作的集合studentsself.collection_students=self.db.students接下来,我下面来实现增删改查操作1、增删包括:添加单条数据和多条数据。插入单条数据对应的方法是:insert_one(dict)该方法返回值类型为InsertOneResult通过inserted_id属性,可以得到插入数据的_id值temp_data={"id":"1","name":"xag","age":18}#1。直接调用集合的insert_one()方法插入数据(插入一条数据)result=self.collection_students.insert_one(temp_data)#返回值为InsertOneResult,通过inserted_id属性获取_id的值print(result.inserted_id)多条数据插入对应的方法为:insert_many([dict1,dict2...])该方法返回值类型为InsertManyResult。通过inserted_ids属性,可以得到插入数据#2的_id属性值列表。插入多条数据-insert_many()result=self.collection_students.insert_many([temp_data,temp_data2])#返回值为InsertManyResult,通过inserted_ids属性获取插入数据的_id列表值print(result.inserted_ids)2.Query使用PyMongo查询MongoDB数据库。常用的方法有:通过某一个属性键值对查询一条记录——通过ObjectId值find_one()查询某条记录——find_one()通过某一个属性键值对查询多条记录——find()通过大于、小于、等于、正则匹配查询等条件进行比较查询前面三种查询方式比较简单,直接举例:defmanage_query(self):"""querydata"""#1,通过某个属性键值对,查询一条记录find_one()#返回值为字典类型#{'_id':ObjectId('5f5c437cfe49fa9a16664179'),'id':'1','name':'xag','age':18}result=self.collection_students.find_one({"name":"xag"})print(result)#2,使用ObjectId值查询某条记录result=self.collection_students.find_one({"_id":ObjectId('5f5c437cfe49fa9a16664179')})print(result)#3.1查询多条记录find()#返回值为游标(Generator),pymongo.cursor.Cursorresult_lists=self.collection_students.find({"name":"xag"})print(result_lists)foriteminresult_lists:print(item)条件比较查询,包括:大于($gt),大于小于等于($gte)、小于($lt)、小于等于($lte)、不等于($ne)、在范围内($in)、不在范围内($nin)例如:查询年龄大于18的数据#3.2条件比较查询,包括大于($gt)、大于等于($gte)、小于($lt)、小于等于($lte)),不等于($ne),在范围内($in),不在范围内($nin)#查询年龄比t大的记录han18result=self.collection_students.find({'age':{'$gt':18}})foriteminresult:print(item)正则匹配查询,包括:$regex:匹配正则表达式$exists:属性是否存在$type:数据类型判断$mod:数据取模运算$text:文本包含查询$where:高级条件查询例如查询name值以“xag”开头的数据#正则匹配查询结果=self.collection_students.find({'name':{'$regex':'^xag.*'}})foriteminresults:print(item)查询更复杂的功能请参考:https://docs.mongodb.com/manual/reference/operator/query/3。更新更新操作包括:更新一条记录和更新多条记录。其中,更新一条记录对应的方法是:update_one(query,update_content)参数包括:查询条件,要修改的内容#1,修改一条记录update_one(query,update_data)#方法中有两个参数,分别是:查询条件,要修改的内容#查询条件query_condition={"name":"xag"}#要修改的内容update_content={"$set":{"name":"Xinganguo"}}#使用update_one()methodUpdatearecordresult=self.collection_students.update_one(query_condition,update_content)可以得到查询匹配到的记录数和返回结果影响的记录数#matched_count:匹配到的记录数#modified_count:the受影响的记录数print(result.matched_count,result.modified_count)对应更新多条记录的方法:update_many(query,update_content)方法中的参数和返回值类似于修改单条记录#2,修改多个记录你pdate_many(query,update_data)#查询条件query_condition={"name":{"$regex":"^star.*"}}#要修改的内容update_content={"$set":{"name":"xag"}}#文档名称以星号开头的记录全部设置为xagresult=self.collection_students.update_many(query_condition,update_content)print(result)print(result.matched_count,result.modified_count)4.删除删除还包括:删除查询中找到的第一条记录,删除查询中找到的所有记录。对应的方法有:delete_one(query),delete_many(query)另外,在返回的结果中,可以得到实际删除的个数defmanage_remove(self):"""删除操作:return:"""#1,delete查询到的第一条记录delete_one()#result=self.collection_students.delete_one({'name':"xag2"})#print(result)#Deletednumber#print(result.deleted_count)#2、删除多条记录delete_many()result=self.collection_students.delete_many({'name':"xag"})print(result)#删除数量print(result.deleted_count)5.常用的统计排序方法包括:limit(num):限制返回结果个数skip(num):忽略num个元素,从num+1个元素开始查看count_documents():查看集合中所有文档的个数,或者根据条件查询满足的文档个数):升序或降序defmanage_count_and_sort(self):"""计数和排序:返回:"""#1。限制返回的结果个数——limit()#result=self.collection_students.find().limit(2)#foriteminresult:#print(item)#2,offsetskip()#例如:忽略前面两个元素,从第三个元素开始查看#result=self.collection_students.find().skip(2)#print([result['name']forresultinresult])#3.1查询集合中的所有学生文档数count_documents()#result=self.collection_students.count_documents({})#print(result)#3.2根据条件查询,然后判断结果数#query_regex={'name':{'$regex':'^xag.*'}}#result=self.collection_students.count_documents(query_regex)#print(result)#4,sortsort()#pymongo.ASCENDING:升序,DESCENDING:降序result=self.collection_students.寻找()。sort('name',pymongo.DESCENDING)print([result['name']forresultinresult])4。Mongoengine在使用Mongoengine操作MongoDB之前需要先定义一个Document的子类。这个子类对应于MongoDB中的文档。添加的静态变量(包括:type、length等)对应数据库document中数据的子类frommongoengineimport*#Document,对应文档对象classStudent(Document):name=StringField(required=True,max_length=500)age=IntField(required=True,default=18)create_time=DateTimeField(default=datetime.now)#配置元数据#指定集合为studentmeta={'collection':'student','strict':False}使用Mongoengine内置的connect()方法,连接到指定的数据库#Connectdatabasetempdef__init__(self):#Connectdatabase#Databasename:temp#authmethod:SCRAM-SHA-1result=connect('temp',host='ip地址',port=27017,username='root',password='123456',authentication_source='admin',authentication_mechanism="SCRAM-SHA-1")print(result)接下来我们来实现增删改查操作1.使用Mongoengine向数据库中添加一条新记录非常方便。只需要实例化一个document对象,调用save()方法,即可以在数据库中存入一条记录definesert(self):"""插入数据:return:"""person=Student(name='xag2',age=20)person.save()2.查询常见的查询操作包括:查询集合中的所有记录通过主键_ID查询第一条记录来查询数据条件查询对应的代码如下:defquery(self):"""一般查询:返回:"""#1、查看集合中所有数据#students=Student.objects.all()#print([item['name']foriteminstudents])#2、查询第一条记录#student=Student.objects.first()#print(student.name,student.age,student.create_time)#3.通过主键_ID查询数据result=Student.objects.filter(pk="5f5c5b34f5b0c049707a1710").first()print(result.name,result.age,result.create_time)#4、条件查询#查询18-20岁数据#__gte:大于等于;__lte:小于等于#默认是升序,可以加一个:-,代表倒序#students=Student.objects(age__gte=18,age__lte=20).order_by('姓名')students=Student.objects(age__gte=18,age__lte=20).order_by('-name')#foriteminstudents:#print(item.name,item.age,item.create_time)值得一提的是,Mongoengine提供了关键字Q来实现高级查询,例如:查询name字段值为xag,age为18的数据defquery_advance(self):"""高级查询:返回:"""#查看名字为xag年龄为18的第一条记录student=Student.objects(Q(name="xag")&Q(age=18)).first()print(student.name,student.age,student.create_time)高级操作可以参考:https://docs.mongoengine.org/guide/querying.html3.更新Mongoengine提供了两个方法filter()和update(),用于过滤待更新分别数据,指定更新内容defupdate(self):"""更新记录:return:"""#1.修改所有记录#修改name减1岁的xag年龄#增加一岁:inc__age=1#减少一岁:dec__age=1#Student.objects.filter(name="xag").update(dec__age=1)#Student.objects.filter(name="xag").update(inc__age=1)#name为xag,所有age小于18的记录更新为age=23#__lt:lessthan#__lte:less大于等于#__gt:大于#__gte:大于等于#Student.objects.filter(name="xag",age__lt=18)。update(age=23)#Student.objects.filter(age__lte=20).update(age=23)如果只需要更改找到的第一条记录,可以使用update_one()方法#2。修改一条记录#agereduce5Student.objects.filter(name='xag').update_one(dec__age=5)4.删除删除操作对应delete()方法。类似地,可以使用filter()和first()方法来限制要删除的范围。defdelete(self):"""删除数据:return:"""#1.删除找到的第一条记录#Student.objects.filter(name="xag").first().delete()#2.删除多条记录#Student.objects.filter(name="xag").delete()#删除name值以xag开头的所有记录Student.objects.filter(name__startswith="xag").delete()5.最后,本文讲解使用Python操作MongoDB最常用的两种方式