尝试计算所有列的匹配。
我目前使用此代码从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]})
首先,这是最好的方法吗?
其次,我如何找到匹配的列数,即尝试限制匹配至少两列的记录。
答案 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程序员
希望它有所帮助,