2017-10-08 4 views
0

Je veux enregistrer mes données, les éditer, puis les enregistrer à nouveau sous le même objet (c'est un dict?).scrapy comment céder à un objet existant mongodb

Je sauvegarde mes données avec yield {'Id': id, 'Name': nom, 'Age': age} en mongodb.

après que je lis les données avec le code suivant:

import scrapy 
import pymongo 
from pymongo import MongoClient 

class example(scrapy.Spider): 
    name = 'example' 
    allowed_domains = ['example.com'] 
    start_urls = ['https://example.com'] 

def __init__(self): 
    self.db = MongoClient() 
    self.datab = self.db.database_name.collection_name.find({}) 


def parse(self, response): 
    for data in self.datab: 
     name = data['Name'] 
     print(name) 

Le code ci-dessus imprimer tous les noms dans la base de données. mais si par exemple je veux modifier les noms comme ceci:

for data in self.datab: 
     name = data['Name'] 
     if name == 'dani': 
      name = 'daniel' 
      yield{'Name':name} 

je le veux céder au même objet qu'il était avant.

~~~~~~~~~~~~~~~~~~~~~~

EDIT: pipelines.py:

import pymongo 
from pymongo import MongoClient 
from scrapy.conf import settings 

class MongoDBPipeline(object): 
def __init__(self): 
    connection = MongoClient(settings['MONGODB_SERVER'], settings['MONGODB_PORT']) 
    db = connection[settings['MONGODB_DB']] 
    self.collection = db[settings['MONGODB_COLLECTION']] 

def process_item(self, item, spider): 
    self.collection.insert(dict(item)) 
    return item 

settings.py:

ITEM_PIPELINES = { 
    'quotes_spider.pipelines.MongoDBPipeline': 300, 
} 
MONGODB_SERVER = 'localhost' 
MONGODB_PORT = 27017 
MONGODB_DB = 'database_name' 
MONGODB_COLLECTION = 'collection_name' 
+0

Utilisez-vous un pipeline pour enregistrer cela? Si oui, code de pipeline également –

+0

@Tarun Lalwani ajouté – daniel

Répondre

1

Vous devez changer

self.collection.insert(dict(item)) 

à

if "_id" in item: 
    _id = item.pop("_id") 
    self.collection.update_one({"_id":_id}, {"$set": item}) 
else: 
    self.collection.insert(dict(item)) 

Et cela

for data in self.datab: 
    name = data['Name'] 
    if name == 'dani': 
     name = 'daniel' 
     yield {'_id': data['_id'], 'Name': name} 

Donc, fondamentalement, quand vous voulez mettre à jour vous donnera les champs _id et mis à jour. Lorsque vous voulez insérer vous céder sans _id