比较数百万个 mongoDB 记录中的变化的最佳方法
Posted
技术标签:
【中文标题】比较数百万个 mongoDB 记录中的变化的最佳方法【英文标题】:Best way to compare changes in millions of mongoDB records 【发布时间】:2020-10-27 01:20:24 【问题描述】:我正在做一个项目,我存储数百万个网站的 dns 记录,我需要定期监控和更新这些数据的变化。数据存储在 mongodb 上,如下所示
domain: "www.google.com",
"IP": [
"value":"216.58.198.78",
"first_seen":"2020-02-01 00:00:00",
"last_seen":"2020-02-10 00:00:00"
,
"value":"216.58.198.75",
"first_seen":"2020-02-11 00:00:00",
"last_seen":"2020-02-25 00:00:00"
,
...
]
我运行定期扫描以获取新域和新的 DNS 记录,我想知道将其与数据库中存储的数据进行比较并更新它的最佳方法。
我的想法是做以下事情。
-
从 DB 中检索所有记录(我认为这一点都不好)
将检索到的数据存储到以域为键的 python 字典中
循环浏览新记录
检查该域是否存在于字典中,然后比较更改并对字典执行必要的更新。
如果域不存在,将其添加到字典中
放弃收藏?
执行批量写入操作以存储新值
这在性能和内存消耗方面听起来很糟糕(我们在内存中存储了数百万条记录),但我不确定其他替代方案(查询然后更新)是否会做得更好(因为我们需要执行数百万个事务)
如果您能就实现这一目标的最佳方法提供一些见解或指导我进行可能有帮助的研究领域,我将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:通常的做法是在数据库表上添加一个数据字段(例如“NeedUpdate”)。
在创建新记录时,该记录的“NeedUpdate”将为“ON”
更新现有记录后,“NeedUpdate”也将设置为“ON”
之后,您可以运行 cron 作业(或任何周期扫描)以处理“NeedUpdate”=“ON”的记录(并在处理后设置“NeedUpdate=''”。
在这种情况下,系统只需要处理需要更新的记录。
【讨论】:
问题中描述的操作是作为cronjob执行的。因此,无论您需要 cronjob 做什么,都可以在那里完成。问题是,更新记录以仅存储差异和时间戳的最佳方法是什么。是否应该查询所有数据,然后在 python 代码级别进行处理?还是一个一个查询更新比较好?如果我不够清楚,请告诉我以上是关于比较数百万个 mongoDB 记录中的变化的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章