基于自定义employeeid字段实现PyMongo插入记录去重的问题咨询
实现PyMongo插入employeeid不重复的可行方案
第一步:创建唯一索引(必做,底层兜底)
首先给employees集合的employeeid字段创建唯一索引,从数据库层面禁止重复值写入,执行一次即可:
# 只需要执行一次创建索引,不需要每次插入都跑 mongo.db.employees.create_index("employeeid", unique=True)
可选实现方案
方案1:直接插入+捕获唯一冲突异常(逻辑简单,性能高)
修正你原有代码的语法和逻辑错误后实现如下:
from pymongo.errors import DuplicateKeyError from flask import jsonify def add_employee(): star = mongo.db.employees _json = request.json _employeeid = _json['employeeid'] _param2 = _json['Param2'] _param3 = _json.get('Param3') if _employeeid and _param2 and _param3 and request.method == 'POST': try: # 注意字段名要和你实际业务对应,这里统一用employeeid作为唯一键 record_id = star.insert_one({ 'employeeid': _employeeid, 'Param2': _param2, 'Param3': _param3 }).inserted_id # 插入成功的返回逻辑可自行调整 resp = jsonify({"status": "success", "id": str(record_id)}) resp.status_code = 200 except DuplicateKeyError: # 重复插入的返回逻辑可自行调整 resp = jsonify({"status": "fail", "msg": "该employeeid已存在"}) resp.status_code = 400 return resp # 参数不合法的返回逻辑可自行调整 resp = jsonify({"status": "fail", "msg": "参数缺失或请求方法错误"}) resp.status_code = 400 return resp
方案2:使用update_one + $setOnInsert 实现无则插入、有则不操作(无异常抛出)
你之前报错是因为直接用了Mongo Shell的语法,PyMongo的语法规则不同,正确写法如下:
from flask import jsonify def add_employee(): star = mongo.db.employees _json = request.json _employeeid = _json['employeeid'] _param2 = _json['Param2'] _param3 = _json.get('Param3') if _employeeid and _param2 and _param3 and request.method == 'POST': result = star.update_one( # 查询条件:匹配对应employeeid {"employeeid": _employeeid}, # 只有当插入新文档时才会执行setOnInsert里的赋值,已存在则什么都不做 { "$setOnInsert": { "employeeid": _employeeid, "Param2": _param2, "Param3": _param3 } }, # 开启upsert,查询不到匹配文档时插入新文档 upsert=True ) if result.upserted_id is not None: resp = jsonify({"status": "success", "id": str(result.upserted_id)}) resp.status_code = 200 else: resp = jsonify({"status": "fail", "msg": "该employeeid已存在"}) resp.status_code = 400 return resp resp = jsonify({"status": "fail", "msg": "参数缺失或请求方法错误"}) resp.status_code = 400 return resp
原有问题说明
- 你之前写的是Mongo Shell的语法,不能直接在PyMongo中运行,PyMongo的
upsert是update_one方法的独立关键字参数,不是放在配置字典里的,所以会提示未定义 - 原有业务代码存在语法和逻辑错误:if判断漏了
and连接request.method == 'POST'、插入语句中_param1未定义、字段名_employeeid和你要校验的唯一键字段名不一致
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

