2012-11-13 34 views
0

尝试计算所有列中的匹配。

我目前使用此代码从Scrapy项目的某些字段进行复制。

def getDbModel(self, item): 
    deal = { "name":item['name'] } 

    if 'imageURL' in item: 
     deal["imageURL"] = item['imageURL'] 
    if 'highlights' in item: 
     deal['highlights'] = replace_tags(item['highlights'], ' ') 
    if 'fine_print' in item: 
     deal['fine_print'] = replace_tags(item['fine_print'], ' ') 
    if 'description' in item: 
     deal['description'] = replace_tags(item['description'], ' ') 
    if 'search_slug' in item: 
     deal['search_slug'] = item['search_slug'] 
    if 'dealURL' in item: 
     deal['dealurl'] = item['dealURL'] 

想知道如何将它变成一个在mongodb中的OR搜索。

我一直在寻找类似下面:

def checkDB(self,item): 
    # Check if the record exists in the DB 
    deal = self.getDbModel(item) 

    return self.db.units.find_one({"$or":[deal]}) 

首先,这是最好的方法是做?

其次,我将如何找到匹配列的数量的计数,即试图限制匹配至少两列的记录。

回答

1

有没有简单的方法来计算MongoDBs上的colum匹配数量,它只是有点匹配,然后返回。

你可能会更好地做这个客户端,我不确定你打算如何使用这个数字,但是没有简单的方法,无论是通过MR还是聚合框架来做到这一点。

您可以在聚合框架中稍微更改您的模式,以便将这些列放置在properties字段内,然后$sum子显示内的匹配。这是一个很好的方法,因为您还可以对它进行排序以创建一种相关性搜索(如果这符合您的要求)。

至于这是否是一个好方法取决于。当使用$or时,MongoDB将为每个条件使用一个索引,这是MongoDB索引中的一种特殊情况,但这意味着在制作$or时应考虑到这一点,并确保您有索引来覆盖每个条件。

您还必须考虑MongoDB将有效评估每个子句,然后合并结果以删除重复项,这对于更大的工作集或更大的工作集可能很重。

当然,你的$或者格式是错误的,你需要一个你的字段数组的数组。在那一刻你有一个单一的数组与其他数组,其中包含所有的属性。当像这样使用时,属性实际上会在它们之间有一个$and条件,所以它不起作用。

你可以你的代码可能更改为:

def getDbModel(self, item): 
    deal = [] 
    deal[] = { "name":item['name'] } 

    if 'imageURL' in item: 
     deal[] = {"imageURL": tem['imageURL']} 
    if 'highlights' in item: 
     // etc 

// Some way down 
return self.db.units.find_one({"$or":deal}) 

注:我不是一个Python程序员

希望它能帮助,