如何使用mongoengine"插入如果不存在其他更新"?

won*_*ng2 21 python django mongodb mongoengine

我正在使用Django中的mongoengine,
这是我的文档定义:

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(required=True)  
    point = mongoengine.GeoPointField(required=True)
Run Code Online (Sandbox Code Playgroud)

我想这样做:
给定一个user_idpoint:
如果没有文件,有这个user_id,创建一个具有user_idpoint并保存;
否则用user_idwith 更新文档point.
我可以用mongoengine在一个声明中这样做吗?

Nic*_*tot 40

请注意,get_or_create现在计划不推荐使用,因为MongoDB中没有事务支持,因此无法确保原子性.

首选方法是更新与更新插入:

Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)
Run Code Online (Sandbox Code Playgroud)

有关MongoDB文档的 upsert的更多信息.

  • 从版本0.9开始有一种新方法(解释[此处](http://stackoverflow.com/a/25863633/719276)):location = Location.objects(user_id = user_id).modify(upsert = True, new = True,set__point = point) (2认同)

art*_*.sw 8

自 0.9 版以来,有一种新方法可以做到这一点(在此处解释):

location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)
Run Code Online (Sandbox Code Playgroud)

它返回创建或更新的对象。


won*_*ng2 5

这就是我提出的:

location = Location.objects.get_or_create(user_id=user_id)[0]  
location.point = point  
location.save()
Run Code Online (Sandbox Code Playgroud)

  • `get_or_create()`现在[已弃用](https://groups.google.com/d/topic/mongoengine-users/U_1t2eYJqCA/discussion).Mongoengine工作人员推荐了[推荐](https://groups.google.com/d/topic/mongoengine-users/C-i7tKkjPg8/discussion).有关详细信息,请参阅@ NCao的答案. (4认同)
  • `location,created = Location.objects.get_or_create(user_id = user_id)`是首选方式!但是,是的,这将做你需要的! (3认同)