前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阶段性总结-python 中的 mongoDB

阶段性总结-python 中的 mongoDB

原创
作者头像
从不摸鱼的van
修改2023-11-20 20:21:00
2931
修改2023-11-20 20:21:00
举报
文章被收录于专栏:杂七杂八杂七杂八

最近一直在忙着开发一套知识图谱的接口,主要用到的是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库

代码语言:python
复制
pip install pymongo

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

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

代码语言:python
复制
import pymongo

or

代码语言:python
复制
from pymongo import MongoClient

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

代码语言:python
复制
client = pymongo.MongoClient(host='localhost', port=27017)

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

代码语言:python
复制
db = client['test']

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

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

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

代码语言:python
复制
use your_database_name    // 此条命令是在bash中运行的

例如:

接入到test2
接入到test2

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

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

我们可以使用

代码语言:javascript
复制
db.creacteCollection("collection_name")    // 此条命令是在bash中运行的

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

pymongo插入数据


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

代码语言:python
复制
van = {"name":"van","age":"18","hobby":["sing","dance","rap"],}

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

代码语言:python
复制
db.testCollection.insert_one(van)

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

代码语言:python
复制
{"_id":"0","name":"van","age":"18","hobby":["sing","dance","rap"],}

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

pymongo查询数据


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

代码语言:python
复制
collection = db["testCollection"]

这时我们使用查询语句:

代码语言:javascript
复制
colleciton.find_one({"name":"van"})

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

代码语言:javascript
复制
colleciton.find_one({"name":"van"},{"_id":0,"name":1})

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

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

代码语言:javascript
复制
colleciton.find_one({"name":"van"}) 
colleciton.find({"name":"van"}).limit(1)

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

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

代码语言:javascript
复制
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字段进行升序排序:

代码语言:python
复制
pipeline = [
 {"$match": {"field": value}},
 {"$sort": {"other_field": 1}}
]

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

代码语言:python
复制
collection.aggregate(pipeline)

pymogon的view(视图)


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

代码语言:javascript
复制
db.createView(
    "myView",
    "myCollection",
    [
        {"$match": {"field": "value"}}
    ]
)    // 在mongosh中执行

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

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

代码语言:python
复制
db.command(
 "createView",
 "myView",
 "myCollection",
    [
        {"$match": {"field": "value"}}
    ]
)

pymongo中的索引(index)


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

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

代码语言:python
复制
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/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mongoDB的简介:
  • pymongo
  • 接下来我们简单写一个pymongo的连接demo:
  • pymongo插入数据
  • pymongo查询数据
  • pymongo中update,delete
  • mongo中的管道(pipeline)
  • pymogon的view(视图)
  • pymongo中的索引(index)
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档