我有一个脚本,可以从日常服务器日志文件中填充mongo数据库。日志文件来自许多服务器,因此无法保证数据的时间顺序。为简单起见,我们假设文档架构是这样的:
{
_id: <username>,
first_seen: <date>,
last_seen: <date>,
most_recent_ip: <string>
}
即,文档按访问服务器的用户的名称编制索引。对于每个用户,我们会跟踪第一次看到用户以及上次访问时的IP。
现在我处理效率非常低:首先尝试插入。如果失败,请按_id
检索记录,然后计算更新的值(例如first_seen
和most_recent_up
),最后更新记录。这是每个日志条目3个db调用,这使得脚本的运行时间非常长,因为数据量非常大。
我想知道我是否可以用upsert替换它。我可以看到如何处理first/last_seen
:可能类似于{$min: {'first_seen': <log_entry_date>}}
(希望在插入新文档时这是正常的)。但是,如何仅在most_recent_ip
时将<log_entry_date> > $last_seen
设置为新值。
我的用例通常是首选模式吗?
答案 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}
)