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]})

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

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

4

1 回答 1

2

没有简单的方法来计算 MongoDB 端的列匹配数,它只是有点匹配然后返回。

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

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

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

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

当然,您的 $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 程序员

希望能帮助到你,

于 2012-11-13T11:06:21.913 回答