PyMongo 基本概念和操作
PyMongo 基本概念和操作
最近尝试用数据库来给数据集提前储存 encode 好的 embeddings,原本想用 Sqlite 的,但是想到各种储存列表、大数值向量都很麻烦,于是去试了试非关系型数据库 MongoDB,发现用的是真的方便真的爽。
本文通过 MongoDB 的 python 接口例子来说明常用的一些使用方法。
MongoDB 基本概念
一篇写的不错的知乎文章:https://zhuanlan.zhihu.com/p/87722764
数据库基本模型
MongoDB 概念 | 对应的 SQL 概念 | 备注 |
---|---|---|
database | database | 一个数据库包含多个集合(collection) |
collection | table | 可以储存多个文档,且没有模式限制 |
document | row | 由多个字段表示,使用的 BSON 格式(类似 JSON) |
field | column | 字段可储存任意数据格式,如列表 |
BSON 数据类型
BSON,Binary JSON,不能说跟 JSON 很像,只能说是一模一样。(并不,实际上多了索引等数据,且支持的数据类型也更多)
1 |
|
其中,_id
字段是一条记录的主键,在 collection 中是唯一的,可以由系统自动生成(类型为 ObjectId
),也可以自己指定。
PyMongo 基本操作
记得先安装并 import 哦。
1 |
|
数据库操作
连接数据库服务器(无密码)
默认端口号是 27017
1 |
|
获取具体的数据库、集合
1 |
|
如果数据库或集合未被创建,则会新建一个。(实际的创建行为会在写入第一个记录时才发生)
CRUD 操作
以在某个 collection 上的查询为例子,操作非常简单,指定对应的字段名即可。
1 |
|
其他具体操作请查阅 MongoDB 官方文档:https://docs.mongodb.com/manual/crud/
以及 pymongo 的示例:https://pymongo.readthedocs.io/en/stable/tutorial.html
聚合操作
聚合(aggregation)稍微复杂,重要的关联查询就是使用这种操作完成的。MongoDB 中,可以给一系列的聚合操作定义一个 pipeline,像流水线一样层层过滤和组装,得到最终结果。
流水线通常是一个字典列表, 列表中每一个字典都是一个聚合操作,字典的 key 就是下面这些 $ 开头的字符串,对应的 value 是具体的参数字典。PyMongo 的一个例子:
1 |
|
常用的一些聚合操作类型
命令 | 描述 |
---|---|
$project | 指定输出文档中的字段 |
$match | 相当于 query 语句 |
$limit | 限制传递给下一步的文档数量 |
$lookup | 多表关联查询 |
$sample | 随机取样 |
$group | 根据 key 分组文档 |
$sort | 根据指定的字段排序文档 |
具体见:
- https://docs.mongodb.com/manual/core/aggregation-pipeline/
- https://docs.mongodb.com/manual/meta/aggregation-quick-reference/
关联查询 $lookup
语法:
1 |
|
参数名 | 说明 |
---|---|
from | 关联的外表 |
localField | 本表的关联字段 |
foreignField | 外表的关联字段 |
as | 输出的字段值 |
所以上面的语句就是我现在在 example
集合(本表)中,跑去看名为 candidate
的集合(外表),将本表中 candidates_ids
字段中与外表的 _id
字段进行关联,相同的值的外表文档输出到一个列表里,插入到本表文档中,字段名为 candidates
。
在我的例子中,我的 candidates_ids
本身就是一个列表,里面仅储存了另一个集合的主键(相当于外键),因此关联后返回一个列表,里面的元素是外表中的文档。例如:
1 |
|
PyMongo 使用流水线进行聚合的示例
1 |
|
定义 pipeline
为聚合操作的列表,然后在 example_collection
集合上进行关联查询,返回一个 cursor
对象。可以直接遍历这个对象拿到值。
cursor
对象
实际上是一个用于遍历 MongoDB 查询结果的工具。详见:https://pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html
具体用法有空另开一篇写,这篇就先到这儿了。