Skip to content

PyMongo 的使用

本文记录 python 中使用 mongodb 的方法
https://pymongo.readthedocs.io/en/stable/tutorial.html

1. 安装

bash
pip install pymongo

2. pymongo 的使用

2.1 配置

python
from pymongo import MongoClient

# mongo 配置
MONGO = {
    'host': '127.0.0.1',
    'port': 27017,
    'username': 'root',
    'password': '123456',
    'authSource': 'admin',
}
client = MongoClient(**MONGO)

db = client['test']

2.2 操作整理

操作语法描述示例
查询find_one查询单个文档db.col.find_one({'key': 'value'})
返回 dictNone
find查询所有文档db.col.find({'key': 'value'})
count_documents查询满足条件的文档数量db.col.count_documents({})
插入insert_one插入一个文档db.test.insert_one({'x': 1})
获取插入的id:res.inserted_id
insert_many插入多个文档db.test.insert_many([{'x': i} for i in range(2)])
更新update_one更新一个文档db.test.update_one({'x': 1}, {'$inc': {'x': 3}})
update_many更新所有匹配到的文档db.col.update_many({'key': 'value'}, {'$set': {'k': 'v'}})
替换replace_one替换一个文档db.test.replace_one({'x': 1}, {'y': 1})
删除delete_one删除一个文档db.test.delete_one({'x': 1})
delete_many删除所有匹配的文档db.test.delete_many({'x': 1})
drop删除表/collectiondb.foo.drop()
db.drop_collection('foo')
去重distinct获取指定 key 的去重列表db.test.distinct('x', {'y': 1})

2.3 字符串转为 ObjectId

python
from bson import ObjectId
document = client.db.collection.find_one({'_id': ObjectId(post_id)})

2.4 重置游标 cursor

https://pymongo.readthedocs.io/en/stable/api/pymongo/cursor.html#pymongo.cursor.Cursor.rewind

python
res = client['db']['col'].find()
# for r in res:  遍历完之后 res 的长度就为 0 了
# 如果想再次遍历 res,就必须重置游标
res.rewind()

2.5 查询最近的一条记录

python
res = client['db']['col'].find_one(
    {'k': 'v'},
    sort=[('_id', -1)]
)
  • sort 作为 find_one 的参数使用

3 常用示例代码

3.1 比较/判断 $exists $in $ne

python
# $gte 大于等于;$lte 小于等于
res = client['db']['col'].find({
    'month': {'$gte': last_month, '$lte': this_month}
}).sort('month')

# $exists 存在;$ne 不等于
deps = client['db']['col'].find(
        {'name': {'$exists': True, '$ne': None}})

# $in 是否在列表中
res = client['db']['col'].find({
    'username': {'$in': users}})

3.2 分页 limit skip sort

python
# limit 和 skip 的使用,常用于分页;sort 排序,-1 倒序
res = client['db']['col'].find().limit(
        page_size).skip((page_number - 1) * page_size).sort(
                [('create_time', -1)])

3.3 多条件 $and $or

python
# $and 多个条件要同时满足;$ne 不等于
res = client['db']['col'].find_one({
    '$and': [
        {'_id': {'$ne': ObjectId(_id)}},
        {'attribute.name': data['attribute']['name']},
    ]
})

# $regex 正则匹配,相当于 sql 中的 like 语法
querys = [
    {'username': {'$regex': key}},
    {'email': {'$regex': key}},
    {'name': {'$regex': key}},
]
# $or 多个查询条件,匹配其中一条即可;
res = client['db']['col'].find(
        {'$or': querys}).sort([('username', 1)])

3.4 更新 $set

python
# $set 更新的字段
client['db']['col'].update_one(
    {'name': name},
    {'$set': {'email': [email]}}
)

3.5 聚合 aggregate

https://www.runoob.com/mongodb/mongodb-aggregate.html

python
# aggregate 聚合操作;
res = client['db']['col'].aggregate([
    {
        '$match': {  # 用于匹配,相当于 sql 中的 where
            'month': month,
            'name': name,
            }
        },
    {
        '$group': {
            '_id': '$email',  # 分组对象
            'score': {'$sum': '$score'}  # $sum 计算总和
        }
    }
])