MongoDB中两个集合之间的Diff()函数

4

我已经进行了研究。如果这是一个重复的问题,我很抱歉,但其他问题中的解决方案并不完全适合我,因此我提出了一个新问题。

使用Javascript比较两个集合的最佳方法是什么?

我有数千个以Mongo文档格式存储的标题:

{
    "url": "google.com",
    "headers": {
        "location": "http://www.google.com/",
        "content-type": "text/html; charset=UTF-8",
        "date": "Mon, 25 Mar 2013 18:12:08 GMT",
        "expires": "Wed, 24 Apr 2013 18:12:08 GMT",
        "cache-control": "public, max-age=2592000",
        "server": "gws",
        "content-length": "219",
        "x-xss-protection": "1; mode=block",
        "x-frame-options": "SAMEORIGIN"
    }
}

我今天运行了我的爬虫。未来,我会再次运行它,并将其存储在第二个集合中。此外,我想比较三个特定的头对象,即服务器(server)x-aspnet-versionx-powered-by,并检测是否存在任何整数增量。
通过两个集合进行迭代并执行diff()的最佳方法是什么?
我的做法正确吗?如有建议,请不吝赐教。

请在您的问题中添加一些额外的细节:我不明白您到底在比较什么。是一个集合中的每个文档和另一个集合中的每个文档吗?频率和文档数量如何?性能是否重要(如果是,程度如何)?您尝试过什么(您应该发布您尝试过的内容)? - WiredPrairie
我想要针对每个URL,在两个月的间隔内比较server x-aspnet-version x-powered-byserver通常会输出Microsoft-IIS/7.0、Apache版本和/或nginx等信息。我想要检测这些双月扫描中是否有任何变化。 - theGreenCabbage
2
展示一下你尝试的代码。这听起来需要非常暴力的方法。我的唯一建议是使用each并设置较小的批处理大小,而不是使用toArray。http://mongodb.github.com/node-mongodb-native/api-generated/cursor.html 或者使用nextObject - WiredPrairie
1个回答

4

一些建议:

由于您计划每月对每个URL进行一次爬取,因此您可以使用URL和访问日期(至少部分datetime对象)的组合作为这些对象的_id。

例如:

{
    "_id": {
        "url": "www.google.com",
        "date": ISODate("2013-03-01"),
    },
    // Other attributes
}

这将带来性能、唯一性和查询回报(请参见这篇4sq博客文章)。您可以像这样进行查询:
db.collection.find({
    "_id": {
        "$gte": {
            "url": yourUrl,
            "date": rangeStart
         },
         "$lt": {
            "url": yourUrl,
            "date": rangeEnd
         },
    }
})

这将产生卓越的、排序良好的结果(按照url先排序,然后按日期排序,似乎正是你想要的)。如果你只想要一个漂亮的集合,包含你已经抓取的所有url和月份,你也可以使用此索引执行覆盖查询(_id字段上)。(这可以为你提供良好的设置,以便逐个访问每个url)。

如果您有特定的文档属性需要比较(headers.server 例如),并且您想要为它们做出特定的比较(例如查找版本号的任何增量),我建议使用某种正则表达式来获取与版本号相关的元素(一个快速而脏的方法可能只是检索所有数字元素),并为每个url绘制图形(我认为这将让你可视化服务器软件随时间的变化)。你也可以通过按顺序扫描它们并在字符串不相同时触发一些事件(也许是报告更改或更改的数值部分)来随时报告这些属性的任何更改。


嗨,marr75。感谢您的建议。我已更改了我的抓取标题,并且现在格式为urldateserverx-aspnet-versionx-powered-by。有没有办法使用纯数字日期?现在使用的日期非常难以分解,如果这是正确的说法。 我的目标是设置一个时间范围,在其中比较serverserverx-aspnet-versionx-aspnet-version以及x-powered-by - theGreenCabbage
我喜欢你的示例的第二个版本的外观。你想要实现的是使用 $lt$gt 来设置日期范围,对吗?但是我该如何在这个示例中前进呢?例如,我应该抓取两个集合,第一个和第二个集合相隔几个月吗?我听说应该使用一个集合,但这意味着我将不得不重新设计我的爬虫代码,由于时间限制,我可能无法做到这一点。我很高兴你能够实现“按url、然后按日期、最后按其他变量”的想法。那正是我想做的。 - theGreenCabbage
但也许我们可以忽略date作为标题,而只是比较两个集合? - theGreenCabbage
你的第一个代码示例也让我有所领悟。我的尝试(在代码中)确保索引我的URL失败了。db.scrape.ensureIndex("url",function(e){ console.log("Error while indexing"); }); - theGreenCabbage
2
当你把一个新手放在键盘、想法和编辑器面前时,往往会发生一些不好的事情 :P - theGreenCabbage
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接