2013-02-28 9 views
15

In meiner Flasche App verwende ich MongöEgine. Ich versuche, mehrere Dokumente in meine Places-Sammlung in meiner MongoDB einzufügen.Multi-Dokument einfügen mit Mongoengine in Mongodb

Meine Dokumentenklasse wie

class places(db.Document): 

    name = db.StringField(max_length=200, required=True)  
    loc = db.GeoPointField(required=True) 

    def __unicode__(self): 
    return self.name 

    a=[] 
    a.append({"name" : 'test' , "loc":[-87,101]}) 
    a.append({"name" : 'test' , "loc":[-88,101]}) 
    x= places(a) 

Die letzte Anweisung definiert ist, nicht

x= places(a) 
TypeError: __init__() takes exactly 1 argument (2 given) 

Ich habe auch versucht, dies zu meinem Beispiel

places.insert(x) 
places.save(x) 

beide scheitern zu speichern. Bitte helfen Sie.

Antwort

21

Places.objects.insert nimmt keine Liste der Wörterbücher es Places Instanzen sein muss. Normalbetrieb wäre für die einzelnen Instanzen Places zu erstellen und speichern, oder zB ein:

Places(name="test", loc=[-87, 101]).save() 
Places(name="test 2", loc=[-87, 101]).save() 

Allerdings, wenn Sie eine Masse einsetzen wollen Sie eine Liste von Places Instanzen passieren können und rufen insert auf dem objects queryset zB:

Places.objects.insert([Places(name="test", loc=[-87, 101]), 
         Places(name="test 2", loc=[-87, 101])]) 
+3

Danke. Wie könnte ich dies verwenden, um ein Upsert zu machen. Ich möchte diese Zeilen einfügen, wenn sie neu sind, andernfalls die vorhandene Zeile aktualisieren. Gibt es ein Places.objects.upsert oder Places.object.insert mit upsert = True Flag? – user1340513

+0

@Ross gibt es eine einfache Möglichkeit zu vermeiden * NotUniqueError *? Ich habe irgendwo gelesen, dass ich in PyMongo Bulk Insert * bestellt habe *, aber ich würde lieber Mongoengine verwenden. Ich kenne _getCollection(), aber ich würde es trotzdem vermeiden, nicht direkt auf die Sammlung zuzugreifen. Ich bevorzuge die Verwendung der Mongoengine-Syntax :) – giliev

+0

@Ross Welche der obigen Operationen ist eine effiziente, ich meine, ob es sich um eine Operation save() oder eine Massenoperation handelt. – hkhr

4

Sie versuchen, Dokument Objekt für mehrere Dokumente gleichzeitig zu initialisieren. Wenn Sie die BaseDocument Klasse von Mongoengine betrachten, werden Sie sehen, dass die __init__ Methode ein Wörterbuch der Schlüsselwortargumente nimmt, die sich auf Felder eines einzelnen Dokuments beziehen.

Wenn Sie eine Masse speichern wollen, müssen Sie eine Liste von Orte Instanzen machen und es zu insert() Methode übergeben.

a = [] 
a.append(places(**{"name": 'test', "loc": [-87,101]})) 
a.append(places(**{"name": 'test', "loc": [-88,101]})) 
x = places.objects.insert(a)