关于在pymongo的upsert

时间:2012-07-16 06:48:47

标签: mongodb pymongo

集合中的每条记录都有两个键“ip”和“timestamp”

db.posts.update({'ip' : '127.0.0.1', 'timestamp' : {'$gt' : sometimestamp}}, {'$set' : {'timestamp' : time.time()}, True)

上面的命令将插入一条新记录,如果字段“ip”与“127.0.0.1”不在集合中或“timestamp”小于某个时间戳

现在,如果我想插入一条新记录,只有“ip”和“127.0.0.1”不在集合中,换句话说,保持“ip”的值是唯一的。

怎么办?

1 个答案:

答案 0 :(得分:1)

你可能想要做的是:

if( ip=127)
   if( ts > myts)
      update;
    else
      DO NOTHING;
else
   insert;

所以基本上,你有两种不同类型的更新......其中一种是在时间戳上进行实际更改,而另一种则告诉mongo什么都不做,即甚至不进行插入。 我猜这是不可能的upsert。因此,最好使用如下简单更新:

db.posts.update ( { 'ip' : '127.0.0.1', 'timestamp' : { '$gt' : sometimestamp } } , { '$set' : { 'timestamp' : time.time() } , False)

我不知道你是怎么在Pymongo写的,但从逻辑上讲,你这样做:

if (db.posts.find_one( { 'ip':'127.0.0.1'} ) != null):
    db.posts.update ( {'ip' : '127.0.0.1'}, { '$set' : {'timestamp' : time.time() } } )

不幸的是,我不能评论性能..