MongoDB作为一种文档型NoSQL数据库在分布式文件存储基础上建立起来的开源非关系型数据库系统。该数据库内容采用K/V存储方式,具有非固定结构,其字段值可包括其它文档,数组及文档数组与传统关系数据库相比,MongoD具有较高的数据存储量及访问性能。由于该系统主要应用于文档管理领域,因此对内存的要求比较严格它与传统的BSON相比具有很多优点:采用了标准的二进制JSON(二进制JS)数据结构,提高了存储和扫描效率,减少了空间开销今天给你简单的介绍一下Python里MongoDB的用法
运行Python上的MongoDB要求用PyMongo库进行以下指令的安装:
pip3setuppymongo
连接时需在PyMongo库中利用MongoClient模块来进行,建立连接的方法有2种,默认情况下只要导入IP及端口号就行当系统运行完毕后,连接就会自动完成;若要重新开始连接时,先输入一个正确的端口号再启动连接过程。连接失败后,将出现提示:连接失败了!若数据库中有账号密码时,需指定相连数据库并对其鉴权,方能顺利相连
导入MongoClient模块frompymongoimportMongoClient,ASCENDING,DESCENDING两种方式1. 传入数据库IP和端口号mc=MongoClient("127.0.0.1",27017)2. 直接传入连接字串mc=MongoClient("mongodb://127.0.0.1:27017")有密码的连接首先指定连接testdb数据库db=mc.testdb通过authenticate方法认证账号密码db.authenticate("username","password")检查是否连接成功,输出以下结果表示连接成功print(mc.server_info()){"version":"4.2.1","gitVersion":"edf6d45851c0b9ee15548f0f847df141764a317e","modules":[],"allocator":"tcmalloc","javascriptEngine":"mozjs","sysInfo":"deprecated","versionArray":[4、2、1、0],"openssl":{"running":"OpenSSL1.1.111Sep2022","compiled":"OpenSSL1.1.111Sep2018"},......省略,"ok":1.0}
成功地实现了数据库连接,下面就来着手介绍一下通过MongoClient模块在mongoDB数据库中实现CURD操作的方法
首先必须规定所需运行的数据库及集合,在此数据库可与Mysql中的DataBase相对应,而集合则与MysqL中的Table相对应然后使用这些工具将数据从一个表拆分成多个表进行管理,并对每个表建立相应的索引结构,最后再通过这个索引结构把数据存储到该表中应该指出,mongoDB里,无需预先建立数据库及集合,当您运行这些数据库或集合时,若不是这样就可以自动建立,但是全部为延时建立,只有加入Document后才能真正建立数据库
db=mc.testdbdb=mc["testdb"]print(db.collection_names())collection=db.testcollection=db["test"]print(collection.find_one())
MongoDB的每一条数据实际上具有唯一的标识_id属性若不显式地指出属性,MongoDB将自动生成ObjectId型_id属性,insert()方法将在实现时返回_id值然而这种方法只能对指定范围内的所有记录进行操作,并且无法区分不同的记录所表示的内容是否一致,这就使得它不能很好地满足实际应用需求然而,PyMongo3.x版正式不再建议采用insert()法,而建议用insert_one()法和insert-many()法将单条记录与多条记录分开插入
#要插入到集合中的对象book={"name":"Python基础","author":"张三","page":80}#向集合中插入一条记录collection.insert_one(book)#返回结果:{"_id":ObjectId("5de4c7b90ae08431839ac2a7"),"name":"Python基础","author":"张三","page":80}#对于insert_many()方法,我们可以将数据以列表形式传递参数book1={"name":"Java基础","author":"李白","page":100}book2={"name":"Java虚拟机","author":"王五","page":100}#创建book_list列表book_list=[book1、book2]#向集合中插入多条记录collection.insert_many(book_list)#返回结果:
查询要求用find_one()或者find()法,在find_one查询中获得的结果为单一的,也就是一个记录,find()返回生成器对象但是在实际应用中往往会遇到两个以上的文件同时出现在一起的情况,这时如何能够快速准确地找到这些文件呢?其实很简单,通过对每个文件名进行修改,即可实现这个功能以下是对上述刚刚插入数据的查询,若查询不成功,将返回None.编码为
通过条件查询一条记录,如果不存在则返回Noneres=collection.find_one({"author":"张三"})print(res)打印结果:{"_id":ObjectId("5de4c7b90ae08431839ac2a7"),"name":"Python基础","author":"张三","page":80}通过条件查询多条记录,如果不存在则返回Noneres=collection.find({"page":100})print(res)打印结果: 使用find()查询会返回一个对象遍历对象,并打印查询结果forrinres:print(r)打印结果:{"_id":ObjectId("5de4c8ae0ae08431839ac2a8"),"name":"Java基础","author":"李白","page":100}{"_id":ObjectId("5de4c8ae0ae08431839ac2a9"),"name":"Java虚拟机","author":"王五","page":100}查询page大于50的记录res=collection.find({"page":{"$gt":50}})通过遍历返回对象,结果如下:{"_id":ObjectId("5de4c7b90ae08431839ac2a7"),"name":"Python基础","author":"张三","page":80}{"_id":ObjectId("5de4c8ae0ae08431839ac2a8"),"name":"Java基础","author":"李白","page":100}{"_id":ObjectId("5de4c8ae0ae08431839ac2a9"),"name":"Java虚拟机","author":"王五","page":100}
以上查询条件我们使用$gt比较运算符。有关查询条件比较运算符与功能运算符的对照表
更新操作与插入操作相似,PyMongo给出了2种更新方式,一种是update_one(?),另一种是update_one.在这2种更新方式中,update_on(?)更新满足该要求的第1条记录
注:
用$set的话,只有book对象中存在的字段才会被更新,而在更新之前有别的字段就不会被更新或删除了
在没有$set的情况下,更新之前的所有数据都将被book对象所取代,而在原来有其它字段的情况下,这些对象将被移除
#查询一条记录book=collection.find_one({"author":"张三"})book["page"]=90#更新满足条件{"author","张三"}的第一条记录res=collection.update_one({"author":"张三"},{"$set":book})#更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数. print(res.matched_count,res.modified_count)#打印结果:11#更新满足条件page>;90的所有记录,page字段自加10res=collection.update_many({"page":{"$gt":90}},{"$inc":{"page":10}})#打印更新匹配和影响的记录数print(res.matched_count,res.modified_count)#打印结果:22book3={"name":"Python高级","author":"赵飞","page":50}#upsert=True表示如果没有满足更新条件的记录,则会将book3插入集合中res=collection.update_one({"author":"赵飞"},{"$set":book3},upsert=True)print(res.matched_count,res.modified_count)#打印结果:00#查询所有记录,并遍历打印出来res=collection.find()forrinres:print(r)#打印结果:#{"_id":ObjectId("5de4c7b90ae08431839ac2a7"),"name":"Python基础","author":"张三","page":90}#{"_id":ObjectId("5de4c8ae0ae08431839ac2a8"),"name":"Java基础","author":"李白","page":110}#{"_id":ObjectId("5de4c8ae0ae08431839ac2a9"),"name":"Java虚拟机","author":"王五","page":110}#{"_id":ObjectId("5de4d76f71aa089d58170a92"),"author":"赵飞","name":"Python高级","page":50}
删除数据也建议采用delete_one()与delete.many()两种方式,delete-one()是删除第1条满足条件的纪录在本论文中,我们主要研究了基于内容过滤技术的个性化信息推送系统的实现过程,并通过实验验证了该算法能够有效地提高用户体验度以及降低网络拥塞率具体操作码为:
result=collection.delete_one({"author":"张三"})print(result.deleted_count)result=collection.delete_many({"page":{"$lt":90}})print(result.deleted_count)
PyMongo在上述标准数据库操作之外,提供下列一般和便捷的操作方式,例如limit()法读取规定量数据skip()法跳过规定量数据,详见下列编码:
#查询返回满足条件的记录然后删除result=collection.find_one_and_delete({"author":"王五"})print(result)#打印结果:{"_id":ObjectId("5de4c8ae0ae08431839ac2a9"),"name":"Java虚拟机","author":"王五","page":110}#统计查询结果个数#全部结果个数collection.find().count()#返回结果:1#满足条件结果个数collection.find({"page":100}).count()#返回结果:0#查询结果按字段排序#升序results=collection.find().sort("page",ASCENDING)#降序results=collection.find().sort("page",DESCENDING)#下面查询结果是按page升序排序,只返回第二条记录及以后的两条结果results=collection.find().sort("page",ASCENDING).skip(1).limit(2)print(results)
注:当数据量为千万级和亿级巨大时,查询中skip的取值以不太大为宜,否则极有可能造成内存溢出
默认在数据插入的时候已有_id索引,当然也可以建立自定义的索引
unique=True时,创建一个唯一索引,索引字段插入相同值时会自动报错,默认为Falsecollection.create_index("page",unique=True)打印结果:"page_1"打印出已创建的索引print(collection.index_information())返回结果:{"_id_":{"v":2、"key":[("_id",1)],"ns":"testdb.test"},"page_1":{"v":2、"unique":True,"key":[("page",1)],"ns":"testdb.test"}}删除索引collection.drop_index("page_1")删除集合collection.drop()
这篇文章向您介绍在Python上如何建立一个与MongoDB数据库相连的数据库,并且以代码形式演示MongoD数据库的增删改查和排序索引,经过上述研究个人认为操作还较为简单和方便如果你有这方面的需求可以直接用这个软件来实现。相信会让你更快更好地使用它。这篇文章也是在学习过程中总结出来的一些技巧和经验后面会给你介绍一下其它数据库的运行情况