如何在mongo中有条件地插入文档?

Par*_*ker 13 mongodb pymongo

我有一份文件

{ key : 'key1', value : 'value1', update_time : 100 }
Run Code Online (Sandbox Code Playgroud)

我想更改最近(更长)的更新时间.我现在正在做的是:

def update_key1(new_value, new_time):
    record = find_one( { key : 'key1' } )
    if not record or record['update_time'] < new_time:
        update( { key : 'key1', value : new_value, update_time : new_time }, upsert=True)
Run Code Online (Sandbox Code Playgroud)

显然,这是一个额外的往返到数据库,但更重要的是有对文档没有锁,并发呼叫可能导致剩余的分贝较低NEW_TIME的价值.有没有办法在条件成立时执行upsert?

编辑:只是为了澄清,目的不是为每个键创建多个文档,然后对查找进行排序.虽然这可以解决我的问题,但这些值会发生很大变化并且会浪费很多空间.

kri*_*ina 1

如果 WPCoder 的响应和 upsert=True 不是您想要的,那么您可能需要 $setOnInsert,它尚未实现: https: //jira.mongodb.org/browse/SERVER-340。它应该在 2.4.0 中实现。