首页后端开发Python阶段性总结-python 中的 mongoDB

阶段性总结-python 中的 mongoDB

时间2023-12-09 00:17:03发布访客分类Python浏览786
导读:最近一直在忙着开发一套知识图谱的接口,主要用到的是mongoDB和neo4j,今天先来总结一部分:mongoDB的使用。mongoDB的简介:mongoDB是最流行的NoSQL数据库之一,传统的mySQL,SQLServer,OracleP...

最近一直在忙着开发一套知识图谱的接口,主要用到的是mongoDB和neo4j,今天先来总结一部分:mongoDB的使用。


mongoDB的简介:

mongoDB是最流行的NoSQL数据库之一,传统的mySQL,SQLServer,OraclePostGre,PostgreSQL等数据库,都是关系型数据库,因为目前世界上OOD(面向对象设计)是程序设计的首要风格,所以能够表示对象之间的关系的数据库耳熟能详,但很多时候,一些数据不需要去抽象成一个对象去存储,比如一本书的具体内容,用SQL中的字段,即使去存储一章也是非常多的,不方便,所以NoSQL(非关系型数据库)就是非常趁手的了。mongoDB是一个文档型数据库,每个数据库中支持多个集合(collection)每个集合中支持存储多个文档(document)文档里面的内容可以是String,integer等常见数据类型,也支持数组,序列键对值,正则表达式,内嵌文档,内嵌代码等数据类型。如果你想存储一本书,那你就可以存储一个关于这本书的集合,集合的每个文档都是章节具体内容的内嵌文档对象,这样就能很形象的表示一本书了。

pymongo

python标准库中没有直接支持mongoDB连接的库,但是有封装好的第三方库pymongo供大家使用。


接下来我们简单写一个pymongo的连接demo:

首先安装最新的pymongo库

pip install pymongo

安装完成后呢,就开始使用:

首先当然是导入。直接导入库就好了,你也可以只导入Client。

import pymongo

or

from pymongo import MongoClient

接下来连接数据库客户端,mongoDB默认端口是27017,由于在本地,服务器地址当然是localhost

client = pymongo.MongoClient(host='localhost', port=27017)

然后我们选择连接的数据库名称:

db = client['test']

mongo 自带了一个test数据库,如果我们使用bash打开mongo的话,默认连接的就是这个数据库,打开终端,输入 mongosh or mongo,我使用的是mongosh

默认进入test数据库默认进入test数据库

如果你想新建别的数据库,只需要在你打开的bash中键入:

use your_database_name    // 此条命令是在bash中运行的

例如:

接入到test2接入到test2

接入到新的数据库后,是没有集合(collection)的,我们可以使用mongo自带的方法查看当前存在的集合名称:

可以看到此时的collection是空的可以看到此时的collection是空的

我们可以使用

db.creacteCollection("collection_name")    // 此条命令是在bash中运行的

也可以在插入一条数据时,让mongodb自动创造。

pymongo插入数据


现在我们尝试插入这样一条数据到test数据库的testCollection中:

van = {
"name":"van","age":"18","hobby":["sing","dance","rap"],}

由于我们没有创建testCollection集合,所以它将在第一次被使用时被mongo自动创建,由于我们只插入一条数据,所以我们使用insert_one()方法。

db.testCollection.insert_one(van)

mongo在存储数据时,会给每个数据(在mongo中被称为document)生成一个唯一id,相当于主键,这个值是唯一的,在数据库中,数据存储的样式是这样的:

{
"_id":"0","name":"van","age":"18","hobby":["sing","dance","rap"],}

我们可以使用查询语句去获得它

pymongo查询数据


由于此时集合已被创建了,我们可以指定集合访问数据库连接:

collection = db["testCollection"]

这时我们使用查询语句:

colleciton.find_one({
"name":"van"}
)

它将返回第一个name=van的doc,但_id会一并返回,如果我们想指定返回的值,可以在函数后面加一个字典

colleciton.find_one({
"name":"van"}
,{
"_id":0,"name":1}
)

字典的内容是doc中关键字的返回参数,关键字对应的value是0,则不返回,为1则返回。

如果我们想返回多个doc,我们使用find()函数代替find_one()即可,实际上,find_one()函数是给find()加了limit=1的限制也就是说:

colleciton.find_one({
"name":"van"}
) 
colleciton.find({
"name":"van"}
).limit(1)

是等价的,我们同时也可以使用sort(),skip()等函数。

如果我们想查询所有内容我们可以使用空参数列表,也可以使用find_all()函数,也就是说:

colleciton.find({
}
)
collection.find_all()

是等价的

pymongo中update,delete


由于业务不需要去更新和删除数据,所以对于数据的更新和删除没有深入了解,但pymongo中已经封装好了find_and_update(),find_and_delete等函数,是非常方便的。

mongo中的管道(pipeline)


在MongoDB中,聚合管道是一种处理数据的方式,它允许你在服务器端对数据进行各种复杂的转换和分析。

一个聚合管道由一系列的阶段(stage)组成,每个阶段都会对数据进行某种操作,例如筛选、排序、分组等。数据会按照阶段的顺序依次通过管道,每个阶段的输出会作为下一个阶段的输入。

以下是一些常用的聚合阶段:

  • $match:筛选出满足条件的文档。
  • $group:按照某个字段将文档分组。
  • $sort:对文档进行排序。
  • $project:选择文档的哪些字段输出。
  • $limit:限制输出文档的数量。
  • $skip:跳过一定数量的文档。

例如,以下的聚合管道会先筛选出field字段为value的文档,然后按照other_field字段进行升序排序:

pipeline = [
 {
"$match": {
"field": value}
}
,
 {
"$sort": {
"other_field": 1}
}

]

如果需要使用管道进行查询,那么可以使用aggregate()函数

collection.aggregate(pipeline)

pymogon的view(视图)


事实上,view是在特定条件下进行crud操作,相当于预设了一个pipeline,如果我们需要创建一个view,则需要在bash中操作,具体命令如下:

db.createView(
    "myView",
    "myCollection",
    [
        {
"$match": {
"field": "value"}
}

    ]
)    // 在mongosh中执行

上书这段代码是在myCollection中创建一个在[{ "$match":{ "field":"value"} } ]这个管道下的视图,那么在这个视图中,每次查询都相当于先执行了pipeline。因此,view的创建并不耗时,它只是相当于对每次的查询先执行pipeline操作。

pymongo中可以使用command方法去模拟实现mongosh中的命令,具体代码如下:

db.command(
 "createView",
 "myView",
 "myCollection",
    [
        {
"$match": {
"field": "value"}
}

    ]
)

pymongo中的索引(index)


索引的目的是缩短查询时间。当你在一个字段上创建了索引,MongoDB会对这个字段的所有值进行排序,并在索引中存储每个值对应的文档的位置。当你查询这个字段时,MongoDB可以直接查找索引,而不需要扫描整个集合,这大大提高了查询的速度。

你可以使用createIndex方法创建索引,例如:

collection.createIndex({
field: 1}
    )

1代表升序排列,-1代表降序排列。

虽然索引可以提高查询的性能,但是它也会占用存储空间,并且会增加写操作的开销,因为每次插入或更新文档时,MongoDB都需要更新索引。


此外,python还提供了motor,用于异步并发的mongo数据库连接模块,更多的知识详见mongodb官网:

https://www.mongodb.com/docs/drivers/pymongo/

https://www.mongodb.com/docs/drivers/motor/

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 阶段性总结-python 中的 mongoDB
本文地址: https://pptw.com/jishu/573960.html
【Redis使用】一年多来redis使用笔记md文档,第(2)篇:命令和数据库操作 PIL中ImageFilter模块几种图片滤波处理和使用方法

游客 回复需填写必要信息