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'}) 返回 dict 或 None |
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 | 删除表/collection | db.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 计算总和
}
}
])