2013-02-28 6 views
15

В моем приложении для флэков я использую MongoeEgine. Я пытаюсь вставить несколько документов в свою коллекцию мест в моем MongoDB.multi document insert использование mongoengine to mongodb

Мой класс документ определен как

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) 

Последнее утверждение не может

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

Я также попытался сохранить это мой экземпляр

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

как неудачу. Пожалуйста помоги.

ответ

21

Places.objects.insert не принимает список словарей он должен быть Places экземпляров. Нормальная работа будет создавать отдельные экземпляры из Places и сохранить или вставить, например:

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

Однако, если вы хотите сделать насыпную вставку вы можете передать список Places экземпляров и вызвать insert на objects QuerySet например:

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

Спасибо. Как я могу использовать это, чтобы сделать upsert. Я хочу вставить эти строки, если они новые, иначе обновите существующую строку. Есть ли объект Places.objects.upsert или Places.object.insert с upsert = True? – user1340513

+0

@ Ross есть какой-то простой способ избежать * NotUniqueError *? Я где-то читал об использовании * заказанного * в объемной вставки PyMongo, но я бы предпочел использовать Mongoengine. Я знаю _getCollection(), но все же я предпочел бы избежать прямого доступа к коллекции. Я предпочитаю использовать синтаксис Mongoengine :) – giliev

+0

@Ross Какая из приведенных выше операций является эффективной, я имею в виду, является ли операция save() или объемной вставкой. – hkhr

4

Вы пытаетесь инициализировать объект Документ Объект для нескольких документов одновременно. Если вы посмотрите на класс mongoengine's BaseDocument, вы увидите, что его метод __init__ принимает словарь аргументов ключевого слова, относящихся к полям одного документа.

Если вы хотите сделать насыпной сохранить, вы должны составить список мест экземпляров и передать его вставки() метода.

a = [] 
a.append(places(**{"name": 'test', "loc": [-87,101]})) 
a.append(places(**{"name": 'test', "loc": [-88,101]})) 
x = places.objects.insert(a) 
Смежные вопросы