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
相关产品推荐
相关产品推荐

