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

まず、これは最善の方法ですか?

次に、一致した列の数をどのように見つけますか。つまり、少なくとも 2 つの列に一致するレコードを制限しようとしています。

4

1 に答える 1

2

MongoDBの最後の列の一致数を数える簡単な方法はありません。それはちょっと一致してから戻ります。

このクライアント側を実行する方がおそらく良いでしょう。このカウント値をどのように使用するのか正確にはわかりませんが、MRを使用するか、これを実行する集約フレームワークを使用するかにかかわらず、簡単な方法はありません。

集約フレームワークでは、スキーマを少し変更して、これらの列をpropertiesフィールド内に配置し、次に$sum一致をサブドキュメント内に配置することができます。これは、関連性検索のタイプ​​を作成するためにソートすることもできるため、優れたアプローチです(それが意図している場合)。

これが良いアプローチであるかどうかは異なります。MongoDBを使用する$or場合、各条件にインデックスを使用します。これはMongoDBインデックス内の特殊なケースですが、作成時にこれを考慮し、$or各条件をカバーするインデックスがあることを確認する必要があることを意味します。

また、MongoDBが各句を効果的に評価し、結果をマージして重複を削除することも考慮する必要があります。重複は、大きな$orsや大きなワーキングセットでは重い場合があります。

もちろん、$ 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 に答える