2017-02-22 13 views
1

pymongoとscrapyを使用して別々のアイテムを別のmongodbコレクションに格納しようとしています。複数のMongoDBコレクションへの書込み

どのように、スパイダが開いたとき 1)pymongo接続の辞書を開始することがパイプラインを作成 2)プロセスに近づくと、名前によってアイテムを識別 3)とコレクションのいずれかにアイテムを挿入しなければなりません所定のリクエスト内で

私はそれが可能であれば、治療中の複数のコレクションに書き込むこともできません。どんな洞察にも感謝します!

+0

がある場合に挿入し、あなたが2つのデータベースに同じデータを保存したいです? – Umair

+0

解決済み!ありがとうございました – Chris

答えて

1

私はスパイダーが異なるアイテムを書くことができるコレクションのdictオブジェクトを最初に作ろうとしていました。

いくつかの調査の後、私はmongodb docsの 'connection pooling'に出くわし、1つの接続を使用する複数のコレクションではなく、複数のエンドポイントへの接続オブジェクトを作成する必要があることを認識しました。

class MongoDBPipeline(BaseItemExporter): 

#... 

    #item types for mongo to insert to correct collection 
    writeTypes = [ 
     'ent_pfrm', 'ent_prsn', 
     'ent_sctn', 'ent_meet', 
     'ent_venu', 'ent_affn' 
    ] 

#... 

    def open_spider(self, spider): 

     #Set db dict 
     self.database = dict([(name,connection[self.config['database']][name]) for name in self.writeTypes]) 

項目が処理されると、名前を取得し、辞書をチェックして、あなたの質問わからない試合

def process_item(self, item, spider): 

    def item_type(item): 
     return type(item).__name__.replace('_Item','').lower() # Team_Item => team 

    item_name = item_type(item) 

    #check if the item matches one of the 'writeTypes' 
    if item_name in self.database.keys(): 
     dbcol = self.database[item_name] 
     dbcol.insert(item) 

    return item 
関連する問題