最近一直在忙着开发一套知识图谱的接口,主要用到的是mongoDB和neo4j,今天先来总结一部分:mongoDB的使用。
mongoDB是最流行的NoSQL数据库之一,传统的mySQL,SQLServer,OraclePostGre,PostgreSQL等数据库,都是关系型数据库,因为目前世界上OOD(面向对象设计)是程序设计的首要风格,所以能够表示对象之间的关系的数据库耳熟能详,但很多时候,一些数据不需要去抽象成一个对象去存储,比如一本书的具体内容,用SQL中的字段,即使去存储一章也是非常多的,不方便,所以NoSQL(非关系型数据库)就是非常趁手的了。mongoDB是一个文档型数据库,每个数据库中支持多个集合(collection)每个集合中支持存储多个文档(document)文档里面的内容可以是String,integer等常见数据类型,也支持数组,序列键对值,正则表达式,内嵌文档,内嵌代码等数据类型。如果你想存储一本书,那你就可以存储一个关于这本书的集合,集合的每个文档都是章节具体内容的内嵌文档对象,这样就能很形象的表示一本书了。
python标准库中没有直接支持mongoDB连接的库,但是有封装好的第三方库pymongo供大家使用。
首先安装最新的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
如果你想新建别的数据库,只需要在你打开的bash中键入:
use your_database_name // 此条命令是在bash中运行的
例如:
接入到新的数据库后,是没有集合(collection)的,我们可以使用mongo自带的方法查看当前存在的集合名称:
我们可以使用
db.creacteCollection("collection_name") // 此条命令是在bash中运行的
也可以在插入一条数据时,让mongodb自动创造。
现在我们尝试插入这样一条数据到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"],}
我们可以使用查询语句去获得它
由于此时集合已被创建了,我们可以指定集合访问数据库连接:
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中已经封装好了find_and_update(),find_and_delete等函数,是非常方便的。
在MongoDB中,聚合管道是一种处理数据的方式,它允许你在服务器端对数据进行各种复杂的转换和分析。
一个聚合管道由一系列的阶段(stage)组成,每个阶段都会对数据进行某种操作,例如筛选、排序、分组等。数据会按照阶段的顺序依次通过管道,每个阶段的输出会作为下一个阶段的输入。
以下是一些常用的聚合阶段:
$match
:筛选出满足条件的文档。$group
:按照某个字段将文档分组。$sort
:对文档进行排序。$project
:选择文档的哪些字段输出。$limit
:限制输出文档的数量。$skip
:跳过一定数量的文档。例如,以下的聚合管道会先筛选出field
字段为value
的文档,然后按照other_field
字段进行升序排序:
pipeline = [
{"$match": {"field": value}},
{"$sort": {"other_field": 1}}
]
如果需要使用管道进行查询,那么可以使用aggregate()函数
collection.aggregate(pipeline)
事实上,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"}}
]
)
索引的目的是缩短查询时间。当你在一个字段上创建了索引,MongoDB会对这个字段的所有值进行排序,并在索引中存储每个值对应的文档的位置。当你查询这个字段时,MongoDB可以直接查找索引,而不需要扫描整个集合,这大大提高了查询的速度。
你可以使用createIndex
方法创建索引,例如:
collection.createIndex({field: 1})
1代表升序排列,-1代表降序排列。
虽然索引可以提高查询的性能,但是它也会占用存储空间,并且会增加写操作的开销,因为每次插入或更新文档时,MongoDB都需要更新索引。
此外,python还提供了motor,用于异步并发的mongo数据库连接模块,更多的知识详见mongodb官网:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。