具有条件字段更新的mongodb upsert

时间:2016-05-23 23:52:47

标签: mongodb

我有一个脚本,可以从日常服务器日志文件中填充mongo数据库。日志文件来自许多服务器,因此无法保证数据的时间顺序。为简单起见,我们假设文档架构是这样的:

{
   _id: <username>,
   first_seen: <date>,
   last_seen: <date>,
   most_recent_ip: <string>
}

即,文档按访问服务器的用户的名称编制索引。对于每个用户,我们会跟踪第一次看到用户以及上次访问时的IP。

现在我处理效率非常低:首先尝试插入。如果失败,请按_id检索记录,然后计算更新的值(例如first_seenmost_recent_up),最后更新记录。这是每个日志条目3个db调用,这使得脚本的运行时间非常长,因为数据量非常大。

我想知道我是否可以用upsert替换它。我可以看到如何处理first/last_seen:可能类似于{$min: {'first_seen': <log_entry_date>}}(希望在插入新文档时这是正常的)。但是,如何仅在most_recent_ip时将<log_entry_date> > $last_seen设置为新值。

我的用例通常是首选模式吗?

1 个答案:

答案 0 :(得分:0)

您可以使用$set设置most_recent_ip,例如

db.logs.update(
    {_id:"user1"},
    {$set:{most_recent_ip:"2.2.2.2"}, $min:{first_seen:new Date()}, $max:{last_seen:new Date()}},
    {upsert: true}
)