0

这似乎是一件非常简单的事情,但我找不到任何真正解释如何做到这一点的讨论。

我正在用MongoDBand构建一个刮板Node.js。它每天运行一次,并将数百个 url 和记录刮到数据库中。例子:

  1. Scraper 到这个谷歌图片搜索页面寻找“堆栈溢出”
  2. Scraper 从此页面获取前 100 个链接
  3. 链接的urlimg srcpage title的记录domain name被保存到 MongoDB。

这是我想要实现的目标:

  • 如果图片不再在100个抓取的链接中,我想从databqse中删除它
  • 如果图像仍然在 100 个抓取的链接中,但细节发生了变化(例如新的页面标题),我想找到mongodb记录并更新它。
  • 如果图像不存在,我想创建一条新记录

我遇到的问题是删除尚未删除的条目。实现这一目标的最佳方法是什么?

到目前为止,我的代码成功地检查了条目是否存在,并更新了它们。它正在删除我遇到问题的不再相关的记录。Pastebin链接在这里:

http://pastebin.com/35cXcXzk

4

2 回答 2

1

您需要为项目添加时间戳(并在每次抓取时更新它们)并定期删除一段时间未更新的项目,或者您需要将项目与特定查询相关联。在后一种情况下,您将收集以前与查询相关联的所有项目,并在新结果出现时将它们标记出来。最后没有标记出列表的任何项目都需要删除。

于 2013-06-06T04:18:14.663 回答
0

另一种可能性是使用 mongodb 2.4 中的新 TTL 索引选项,允许您设置文档的生存时间

http://docs.mongodb.org/manual/tutorial/expire-data/

这将使服务器随着时间的推移使它们过期,而不必执行大量昂贵的删除执行。

另一个优化是对集合使用 2 的幂选项以避免写入、删除循环创建的内存的高碎片

http://docs.mongodb.org/manual/reference/command/collMod/

于 2013-08-12T14:04:55.157 回答