Django MongoEngine获取或创建替代方案

Django MongoEngine获取或创建替代方案,django,mongodb,mongoengine,Django,Mongodb,Mongoengine,我一直在Django应用程序中对MongoEngine使用get_或_create方法。今天,我注意到有一些重复条目。我在get_或create的MongoEngine API参考中发现了这一点: 这需要两个单独的操作,因此存在竞争条件。因为mongoDB中没有事务,所以应该研究其他方法,以确保在使用此方法时不会意外复制数据。现在计划在1.0之前删除此项 我应该用这样的东西吗 from models import Post post = Post(name='hello') try: P

我一直在Django应用程序中对MongoEngine使用get_或_create方法。今天,我注意到有一些重复条目。我在get_或create的MongoEngine API参考中发现了这一点:

这需要两个单独的操作,因此存在竞争条件。因为mongoDB中没有事务,所以应该研究其他方法,以确保在使用此方法时不会意外复制数据。现在计划在1.0之前删除此项

我应该用这样的东西吗

from models import Post
post = Post(name='hello')
try:
    Posts.objects.get(name=post.name)
    print "exists"
except:
    post.save()
    print "saved"
这能解决我的问题吗?
有更好的方法吗?

要执行upsert,请使用以下语法:

Posts.objects(name="hello").update(set__X=Y, upsert=True)

这将添加一篇名为“hello”的帖子,如果该帖子不存在,则其中X=Y,否则只需设置X=Y即可更新现有帖子。

您的建议不会解决问题。假设有两个程序实例(“线程”)正在运行。两者完全同步运行。因此,两个线程同时进行存在性检查,并且还没有对象存在。然后他们继续前进,两人都救了→ 重复此替换的问题是它不会返回1)“我插入了还是更新了?”2)新/更新对象的ID是什么?我不喜欢update方法,因为它不能简单地传递一个简单的字典来指定更新属性。您必须在每个关键点之前预先输入“set_uuu”。