2013-02-28 28 views
15

Nella mia app flask sto usando MongoeEgine. Sto cercando di inserire più documenti nella mia raccolta di luoghi nel mio MongoDB.inserto multi documenti usando mongoengine in mongodb

La mia classe di documento è definito come

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) 

L'ultima affermazione non riesce

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

Ho anche cercato di salvare questo al mio esempio

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

entrambi falliscono. Per favore aiuto.

risposta

21

Places.objects.insert non ci vuole un elenco di dizionari che ha da essere Places istanze. Le normali operazioni potrebbe essere quella di creare singole istanze di Places e salvare o inserire ad esempio:

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

Tuttavia, se si vuole fare un grosso inserto è possibile passare un elenco di Places istanze e chiamare insert sul objects set di query ad esempio:

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

Grazie. Come potrei usarlo per fare un upsert. Voglio inserire queste righe se sono nuove, altrimenti aggiorna la riga esistente. C'è un Places.objects.upsert o Places.object.insert con upsert = True flag? – user1340513

+0

@Ross c'è un modo semplice per evitare * NotUniqueError *? Ho letto da qualche parte sull'uso di * ordinato * nell'input bulk PyMongo, ma preferirei usare Mongoengine. Conosco _getCollection(), ma preferirei comunque evitare di non accedere direttamente alla raccolta. Preferisco usare la sintassi di Mongoengine :) – giliev

+0

@Ross Quale delle operazioni sopra descritte è efficiente, voglio dire se si tratta di un'operazione save() o di un'operazione di inserimento di massa. – hkhr

4

Si tenta di inizializzare l'oggetto Documento per più documenti contemporaneamente. Se osservate la classe BaseDocument di mongoengine, vedrete che il suo metodo __init__ accetta un dizionario di argomenti di parole chiave, che si riferiscono ai campi di un singolo documento.

Se si vuole fare un grosso risparmio, è necessario fare un elenco di luoghi istanze e passarlo al inserto() metodo.

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