2012-11-13 69 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程序員

希望它能幫助,