MongoEngine get_or_create 替代方案

woh*_*ejm 2 django mongodb mongoengine

我一直在 Django 应用程序中使用 MongoEngine 的 get_or_create 方法。今天,我注意到有一些重复的条目。我在 MongoEngine API Reference for get_or_create 中发现了这一点:

\n\n
\n

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

\n
\n\n

我应该使用这样的东西吗?:

\n\n
from models import Post\npost = Post(name=\'hello\')\ntry:\n    Posts.objects.get(name=post.name)\n    print "exists"\nexcept:\n    post.save()\n    print "saved"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这能解决我的问题吗?\n有更好的方法吗?

\n

Ros*_*oss 6

要执行更新插入,请使用以下语法:

Posts.objects(name="hello").update(set__X=Y, upsert=True)
Run Code Online (Sandbox Code Playgroud)

这将添加一个名为“hello”的帖子,如果它尚不存在,则 X = Y,否则它将更新一个现有帖子,只需设置 X = Y。

  • 此替换的问题在于它不会返回 1)“我插入还是更新?” 2) 新的/更新的对象的 ID 是什么?请参阅http://stackoverflow.com/questions/22176934/how-do-i-tell-if-i-inserted-during-upsert-in-mongoengine (2认同)