将数据划分为两个MongoDB集合 - 现在如何比较结果?

时间:2015-04-09 23:25:03

标签: python mongodb scrapy pymongo

在这里完成MongoDB /数据库noob所以任何提示都将不胜感激。 我使用scrapy将数据直接写入本地托管的MongoDB服务器。 我想比较"价格"数据从一个集合到" price7"另一个集合中的数据。名称字段在集合中是相同的。 这样做的最佳方式是什么?

此处数据的Sloppy屏幕截图:enter image description here

1 个答案:

答案 0 :(得分:3)

很遗憾,您无法直接在mongo中的2个集合之间进行比较,而无需在某些花哨的javascript中使用。

以下是您如何实现这一目标的示例,https://stackoverflow.com/a/9240952/4760274

既然你已经在使用scrapy了,而且似乎对疯狂的mongodb内部结构感到不舒服,那么就很容易用python脚本来进行评估

import pymongo
conn = pymongo.Connection('localhost', 27017)
db = conn['databasename']

for item in db.collection1.find():
    _id = item['_id']
    item2 = db.collection2.find({'_id':_id})
    print "{}: {}, {}: {}, diff: {}, a>b?:{}".format(
        item['name'], item['price'], item1['name'], 
        item1['price'], item['price'] - item1['price'],
        item['price'] > item1['price'])

最后,您可以修改scrapy模块,只需将两者插入到同一个集合中,调整字段名称以识别来自不同来源的不同值,并允许mongo合并它,在单个集合中,您可以执行更简单的查询来比较价格

db.unified_collection.find({$where: "this.price1 > this.price2"})  

(但这并不能让您在单个查询中获得差异,就像SQL查询一样)

编辑:port必须是int:)

更新: 它也应该明智地注意上面的比较^假设您正在设置ID并且不使用mongo生成的_id(它看起来您可能正在使用),这些是随机生成的,因此&# 39;两个相同的实体之间没有关系。为了使它们与上述任一方法(脚本或具有单独的爬虫使用相同的数据模型)正确匹配,您需要一些东西来限定唯一性,以便在两个来源之间进行任何合理的比较。 /> 从您的数据图像看,最安全的赌注是"名称"字段,但即使有轻微的差异,你也会得不到足够的结果。无论是迭代2个集合还是比较或合并,你都需要一些规则来清理和比较以获得良好匹配(正则表达式,soundex,其他字符串操作技巧),如果在爬虫/模型方面完成,你可以需要使您的统一集合在字段上唯一,并且清理后的名称的哈希值将成为一个很好的候选值(以保持原始值不变)。

另一个选项是SQL,对于您正在进行的分析测试非常有用,但是您再次面临如何关联(更好,如何操纵关联)以及架构更改/迁移(以及缺乏)的问题能够在可能的情况下存储额外的错误数据。