You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoEngine实现Upsert:存在则追加IntChoiceField列表,不存在则创建

正确实现MongoEngine Upsert并向列表追加元素

问题根源

你当前的写法Collection(user_id=user_id).update(...)是错误的:Collection(user_id=user_id)是实例化了一个全新的Document对象,而非创建查询条件。调用这个实例的update()时,会直接对这个新对象执行操作,导致无论数据库中是否存在匹配user_id的记录,都会触发upsert创建新条目。

正确写法

必须使用MongoEngine的查询集(QuerySet)语法,通过Collection.objects()指定查询条件后再执行更新:

1. 避免重复元素:用add_to_set

如果希望types列表中不出现重复值,使用add_to_set:

Collection.objects(user_id=user_id).update(
    add_to_set__types=1,
    upsert=True
)

2. 允许重复元素:用push

如果需要允许列表中存在重复元素,使用push:

Collection.objects(user_id=user_id).update(
    push__types=1,
    upsert=True
)

关键说明

  • Collection.objects(user_id=user_id)会生成匹配指定user_id的查询集;
  • 查询集的update()方法会先查找数据库中的匹配记录:找到则执行追加更新,找不到则自动创建包含user_id和目标types值的新记录;
  • 为了避免硬编码错误,建议使用类常量代替数值,比如Collection.TYPE_1代替1:
Collection.objects(user_id=user_id).update(
    add_to_set__types=Collection.TYPE_1,
    upsert=True
)

内容的提问来源于stack exchange,提问作者Amir Shabani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:11:03