Sto usando MongoEngine in un progetto di scrap-web. Vorrei tenere traccia di tutte le immagini che ho incontrato su tutte le pagine web raschiate.Mongoengine - Come eseguire un'operazione "salva nuovo elemento o incremento contatore"?
Per fare ciò, memorizzo l'immagine src
URL e il numero di volte che l'immagine è stata rilevata.
La definizione del modello MongoEngine è il seguente:
class ImagesUrl(Document):
""" Model representing images encountered during web-scraping.
When an image is encountered on a web-page during scraping,
we store its url and the number of times it has been
seen (default counter value is 1).
If the image had been seen before, we do not insert a new document
in collection, but merely increment the corresponding counter value.
"""
# The url of the image. There cannot be any duplicate.
src = URLField(required=True, unique=True)
# counter of the total number of occurences of the image during
# the datamining process
counter = IntField(min_value=0, required=True, default=1)
sto cercando il modo corretto per l'attuazione del processo di "salvare o incremento".
Finora, sto gestire in questo modo, ma sento che ci potrebbe essere un modo migliore, built-in di farlo con MongoEngine:
def save_or_increment(self):
""" If it is the first time the image has been encountered, insert
its src in mongo, along with a counter=1 value.
If not, increment its counter value by 1.
"""
# check if item is already stored
# if not, save a new item
if not ImagesUrl.objects(src=self.src):
ImagesUrl(
src=self.src,
counter=self.counter,
).save()
else:
# if item already stored in Mongo, just increment its counter
ImagesUrl.objects(src=self.src).update_one(inc__counter=1)
C'è un modo migliore di farlo?
Grazie mille per il vostro tempo.
Grazie, che ha funzionato perfettamente! –
A proposito, consiglieresti di sovrascrivere la funzione Document.save() con questo comportamento, o di implementarlo in un nuovo metodo ImagesUrl? –
Ti consiglierei di non usare 'save' perché il suo intento non è chiaro - io farei il codice' update_one'. – Ross