2013-02-28 12 views
15

W mojej aplikacji do kolb używam MongoeEgine. Próbuję wstawić wiele dokumentów do mojej kolekcji miejsc w moim MongoDB.wstawianie wielu dokumentów za pomocą mongoengine do mongodb

Moja klasa jest zdefiniowana jako dokument

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) 

Ostatnia wypowiedź nie

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

Próbowałem też zapisać to do mojego instancji

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

zarówno niepowodzeniem. Proszę pomóż.

Odpowiedz

21

Places.objects.insert nie bierze listę słowników musi być Places przypadki. Działania normalne byłoby stworzenie indywidualnych wystąpień Places i zapisać lub wstawić np

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

Jednak jeśli chcesz zrobić luzem wstawić można przekazać listę Places instancji i wywołać insert na objects queryset np

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

Dzięki. Jak mogę tego użyć, aby zrobić upsert. Chcę wstawić te wiersze, jeśli są nowe, lub zaktualizować istniejący wiersz. Czy istnieje obiekt Places.objects.upsert lub Places.object.insert z flagą upsert = True? – user1340513

+0

@Ross jest jakiś prosty sposób na uniknięcie * NotUniqueError *? Czytałem gdzieś o użyciu * zamówione * w wkładce luzem PyMongo, ale wolałbym użyć Mongoengine. Znam _getCollection(), ale nadal wolałbym unikać bezpośredniego dostępu do kolekcji. Wolę używać składni Mongoengina :) – giliev

+0

@Ross Która z powyższych operacji jest wydajna, mam na myśli to, czy jest operacją save() lub bulk insert. – hkhr

4

Próbujesz zainicjować obiekt Document dla wielu dokumentów jednocześnie. Jeśli spojrzysz na klasę mongoengine BaseDocument, zobaczysz, że jej metoda __init__ pobiera słownik argumentów słów kluczowych, które odnoszą się do pól jednego dokumentu.

Jeśli chcesz zrobić luzem zaoszczędzić, trzeba zrobić listę miejscach instancji i przekazać go do wkładki() metody.

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