计算Mongodb $或中的匹配项

时间:2012-11-13 00:00:53

标签: python mongodb

尝试计算所有列的匹配。

我目前使用此代码从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 个答案:

答案 0 :(得分:1)

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

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

您可以在聚合框架中稍微更改您的架构,将这些列放在properties字段中,然后$sum在subdocuemnt中匹配。这是一种很好的方法,因为您还可以对其进行排序以创建一种相关性搜索(如果这是您的意图)。

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

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

当然,你的$的格式或错误,你需要一个字段数组的数组。在那一刻,你有一个单独的数组与另一个具有所有属性的数组。当像这样使用时,属性实际上会在它们之间具有$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程序员

希望它有所帮助,