25

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

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(required=True)  
    point = mongoengine.GeoPointField(required=True)

我想这样做:
给定 auser_id和 a point
如果没有具有 this 的文档,则使用 anduser_id创建一个user_idpoint保存它;
否则用user_idwith更新文档point
我可以用 mongoengine 在一个语句中做到这一点吗?

4

4 回答 4

46

请注意,get_or_create现在计划弃用它,因为 MongoDB 中没有事务支持,它无法确保原子性。

首选方法是使用 upsert 更新

Location.objects(user_id=user_id).update_one(set__point=point, upsert=True)

更多关于MongoDB 文档的 upserts 。

于 2013-04-19T08:44:59.297 回答
8

从 0.9 版开始有一种新方法(在此处解释):

location = Location.objects(user_id=user_id).modify(upsert=True, new=True, set__point=point)

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

于 2015-01-20T12:56:40.487 回答
5

这就是我想出的:

location = Location.objects.get_or_create(user_id=user_id)[0]  
location.point = point  
location.save()
于 2011-12-09T15:45:33.787 回答
1

或者您可以通过以下方式向您的类对象添加一个方法:

class Location(mongoengine.Document):  
    user_id = mongoengine.IntField(required=True)  
    point = mongoengine.GeoPointField(required=True)

    def register(self):
        # if doesnt exist, create user id and point field
        if not Location.objects(user_id=self.user_id):
            self.user_id = self.user_id
            self.point = self.point
            self.save()
            return True
        # does exist, do nothing
        else:
            return False
于 2019-09-17T15:37:32.090 回答