[ pymongo的使用 ]


Pymongo基本使用

from pymongo import MongoClient from django.conf import settings

查询

# 1. 分页
res = collection.find({}, {"_id": 0}).limit(limit).skip(offset)

# 2. 查询, 并限制返回字段
# 前面括号是条件, 后面括号为限制返回字段(0不返回, 1返回)
res = collection.find_one({"user_id": pk}, {"_id": 0})

新增

# 1. 插入
res = collection.find({}, {"_id": 0}).limit(limit).skip(offset)

更新

# 1. 更新, 列表里多个字段, 里的某个值
# 前面括号是搜索条件, 后面括号为修改条件
# $set为方法
# commodity_list.$.count为指定列表里查询条件的那个count值,对他进行修改
res = collection.update_one({"user_id": data.user_id, "commodity_list.id": data.commodity_id},
                                {"$set": {"commodity_list.$.count": data.count}})
 if res.modified_count:
        return 200, {"msg": "修改成功"}
    else:
        return 200, {"msg": "没有修改的值"}

删除

res = collection.delete_one({"user_id": pk})

在mongo中维护id, 提供给pg数据绑定使用

MONGODB_SETTINGS = settings.DATABASES["mongo"]
client = MongoClient(
host=MONGODB_SETTINGS['CLIENT']['host'],
port=MONGODB_SETTINGS['CLIENT']['port'],
username=MONGODB_SETTINGS['CLIENT']['USERNAME'],
password=MONGODB_SETTINGS['CLIENT']['PASSWORD'],
)
db = client[MONGODB_SETTINGS['NAME']]
print(client.server_info()['version'])
eform_collection = db.eform_eform  # 替换为实际集合名

# 执行原生MongoDB查询(查询指定id的数据)
result = eform_collection.aggregate([
{'$match': {'id': 11}},
{'$project': {'id': 1, 'eformSchema_id': 1, 'schemaRetrieveDate': 1}}
])
print(list(result))

# 批量查询
result = eform_collection.aggregate([
{'$match': {'id': {'$in': [11, 12, 13]}}},
{'$project': {'id': 1, 'eformSchema_id': 1, 'schemaRetrieveDate': 1}}
])
print(list(result))

# 批量修改
# 批量更新示例1:将所有匹配文档的status字段更新为'completed'
result = eform_collection.update_many(
{'status': 'pending'},  # 查询条件
{'$set': {'status': 'completed'}}  # 更新操作
)

# 批量更新示例2:使用$inc操作符递增数值字段
result = eform_collection.update_many(
{'category': 'A'},
{'$inc': {'count': 1}}  # 将count字段加1
)

# 实现维护id
# 更新时检查当前seq值
result = eform_collection.update_one(
{'_id': 11, 'auto.seq': 163},
{'$set': {'auto.seq': 164}}
)

if result.modified_count == 0:
# 数据已被其他进程修改
raise Exception('并发冲突:seq值已变更')