MongoDB:进行原子创建和返回操作

时间:2013-03-28 12:17:56

标签: mongodb

我需要在mongodb中创建一个文档,然后立即在我的应用程序中使用它。执行此操作的常规方法是(在Python代码中):

doc_id = collection.insert({'name':'mike', 'email':'mike@gmail.com'})
doc = collection.find_one({'_id':doc_id})

这有两个问题:

  • 对服务器的两个请求
  • not atomic

所以,我尝试使用find_and_modify操作在upserts的帮助下有效地执行“创建并返回”:

doc = collection.find_and_modify(
    # so that no doc can be found
    query= { '__no_field__':'__no_value__'},

    # If the <update> argument contains only field and value pairs,
    # and no $set or $unset, the method REPLACES the existing document
    # with the document in the <update> argument,
    # except for the _id field
    document= {'name':'mike', 'email':'mike@gmail.com'},

    # since the document does not exist, this will create it
    upsert= True,

    #this will return the updated (in our case, newly created) document
    new= True
)

这确实按预期工作。我的问题是:这是否是完成“创造和回归”的正确方法,还是我遗失了任何问题?

1 个答案:

答案 0 :(得分:1)

您在普通的普通插入电话中究竟缺少什么?

如果它不知道_id将是什么,你可以先自己创建_id并插入文档。然后你就知道它的样子。其他任何字段都不会与您发送到数据库的字段不同。

如果您担心插入成功,可以检查返回代码,并设置write concern,提供足够的保证(例如已将其刷新到磁盘或复制到足够的节点) )。