2017-05-04 3 views
0

Ich muss die Datensätze in der MongoDB aufstellen. Ich habe eine einfache Logik verwendet, aber es hat nicht funktioniert. Bitte helfen Sie mir, das zu beheben.Mongo DB, Python: Upsert für alle 10000 Datensätze.

from pymongo import MongoClient 
import json 
import sys 
import os 
client = MongoClient('localhost', 9000) 
db1 = client['Com_Crawl'] 
collection1 = db1['All'] 
posts1 = collection1.posts 
ll=[] 
f=file(sys.argv[1],'r') 
for i in f: 
    j=json.loads(i) 
    ll.append(j) 
#print ll 
print len(ll) 
count = 0 
for l in ll: 
    count = count+1 
    if count <= 10000: 
     print count,l 
     print posts1.update({'vtid':l},{'$set': {'processed': 0}},upsert = True,multi = True) 
print "**** Success ***" 

Die Datei enthält 10 Millionen Datensätze. Der obige Code hat eine neue Spalte eingefügt und seinen Wert für 10000 Datensätze auf '0' aktualisiert. Aber wie kann der Rest der Datensätze in einem Batch von 10000 pro Ausführung.

+0

Nicht sicher über den Batch-Teil, aber diese Schleife wird nur während "count <= 10000" hochgeladen und die Zählung wird nie zurückgesetzt. Wenn Sie also 10000 Datensätze erreicht haben, tritt das Upsert nicht mehr auf. – ktbiz

+0

Ja .. aber wie kann ich die Zählung für den nächsten Satz von Werten zurücksetzen. – NiviSRa

+0

Wahrscheinlich möchten Sie nur in Schritten von 10000 inkrementieren und bei jedem Schritt eine Scheibe 'll' einfügen. Verwenden Sie 'range' Anstatt jedes Element zu durchlaufen. – ktbiz

Antwort

0

Mongodb hat Bulk-Update-Operationen, die die Datenbank in großen Mengen aktualisieren. Sie können jedes no dict hinzufügen und können in einem einzigen Schritt aktualisieren, aber es aktualisiert 1000 by 1000 im Batch refer this, um eine Idee über geordnete und ungeordnete Bulk-Operation und refer this bekommen, um eine Idee über Bulk-Update refer this zu wissen, wie Bulk-Operationen funktionieren . Also, wenn Sie Bulk-Update folgen wiil es

from pymongo import MongoClient 
client = MongoClient('localhost', 9000) 
db1 = client['Com_Crawl'] 
collection1 = db1['All'] 
posts1 = collection1.posts 
bulk = collection1.posts.initialize_unordered_bulk_op() 
ll=[] 
f=file(sys.argv[1],'r') 
for i in f: 
    j=json.loads(i) 
    ll.append(j) 
#print ll 
print len(ll) 
count = 0 
for index,l in enumerate(ll): 
    bulk.find({'vtid':l}).update({'$set': {'processed': 0}},upsert = True,multi = True) 
    if (index+1)%10000 == 0: 
     bulk.execute() #this updates the records and prints the status. 
     bulk = collection1.posts.initialize_unordered_bulk_op() #reinitialise for next set of operations. 
bulk.execute() #this updates the remaining last records. 

wie Joe D zeigte sein Sie können auch die Aufzeichnungen und Aktualisierung in der Masse überspringen.

+0

Danke Mani. Aber ich stoße auf AttributeError: 'BulkOperationBuilder' Objekt hat kein Attribut 'Update'. – NiviSRa

+0

Oh okay. Lass mich es jetzt versuchen. Ich habe einen Zweifel; Benötigt update() jetzt die Option upsert? weil, wenn ich in der Abfrage gefunden habe, 'bulk.find ({'vtid': l}). update ({'$ set': {'verarbeitet': 0}}, upsert = True, multi = True) TypeError : update() hat ein unerwartetes Schlüsselwortargument "umgeregt" – NiviSRa

+0

, wenn Sie 'upsert = True 'setzen, wird ein neuer Datensatz erstellt, wenn die Übereinstimmung nicht gefunden wird. Wenn 'upsert' auf' false' gesetzt ist, wird nichts unternommen, wenn keine Übereinstimmung gefunden wird. Beachten Sie auch, dass in dem Kommentar, den ich geschrieben habe, es als "verärgert" in dem Fehler erwähnt wird. bitte überprüfe das. – Mani

1

Sie könnten stattdessen so etwas tun.

for l in ll: 
    for post in posts1.find({}).skip(count*10000).limit(10000): 
     print post.update({'vtid':l},{'$set': {'processed': 0}},upsert = True,multi = True) 
    count += 1 
print "**** Success ***" 

skip() tut genau das, was Sie denken würde, überspringt es, dass viele Einträge in der queryset, dann limit() Grenzen, die also im Wesentlichen auf 10000. führt Sie count verwenden die Einträge beginnend mit 0 zu erhalten, 10000, 20000, etc. und limitiert nur 10000 nach diesem Startpunkt.

+0

Danke Joe D. Ich werde es jetzt versuchen. – NiviSRa

+0

TypeError: Objekt 'Collection' kann nicht aufgerufen werden. Wenn Sie die Methode 'skip' für ein 'Collection'-Objekt aufrufen möchten, schlägt dies fehl, da keine solche Methode existiert. Ich bin auf diesen Fehler gestoßen. @ Joe D – NiviSRa

+0

Entschuldigung, ich habe nicht gesehen, dass es eine Sammlung war, ich werde es aktualisieren. @NiviSra –