2013-03-14 10 views
6

Próbuję znaleźć elegancki sposób aktualizacji istniejącego dokumentu MongoDB o dane otrzymane ze strony internetowej jako json. Problem polega na tym, że nie wiem z góry, które pola mają zostać zaktualizowane - nie mogę więc użyć zestawu set__field, Mam tylko jsonową reprezentację pól do zaktualizowania w moim dokumencie MongoDB. Dodatkowo używam DynamicDocuments, więc mogą istnieć nowe pola do ustawienia w dokumencie. npJak zaktualizować z json a Mongoengine DynamicDocument

class Study(DynamicDocument): 
    study_accession_nr = StringField() 
    study_name = StringField() 
    study_type = StringField() 

i json może wyglądać - na przykład:

{"_id" : "123", "study_name" : "Statistics"} 

lub

{"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"} 

mogę to zrobić łatwo z konsoli lub za pomocą pymongo, ale nie wiem, jak to zrobić, używając Mongoengine, chyba że ręcznie ustawię setattr (myDocInstance, nameOfField, val), co nie wygląda tak elegancko. Dzięki!

+0

Jeśli potrzebujesz czystego DB, dlaczego wybierasz ORM ze ścisłymi regułami? Powinieneś spróbować pymongo. – Denis

+1

Ponieważ chcę mieć hierarchię dokumentów i dokumentów osadzonych oraz zdefiniować zestaw wymaganych pól, a ja jestem dość elastyczny w polach opcjonalnych. – Clara

+0

"hierarchia dokumentów i dokumentów wbudowanych" to zadanie programisty, a nie ORM "i zdefiniowanie zestawu wymaganych pól", jeśli mówimy o aplikacji internetowej, można po prostu sprawdzić formularze od użytkowników. – Denis

Odpowiedz

5

można po prostu przekazać dane podczas inicjowania klasy:

data = {"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"} 
doc = Study(**data) 

zaktualizować istniejące modele można albo wywołanie update (preferowane) lub zmienić model i nazywają uratować.

np

Doc.update(set__VAR=Val, set__VAR2=Val2) 

Albo

setattr(Doc, 'VAR', val) 
setattr(Doc, 'VAR2', val2) 
Doc.save() 

lub

Doc.VAR = val 
Doc.VAR2 = val2 
Doc.save() 
+1

Tak, ale potrzebuję zmodyfikować ** istniejący ** dokument, który został zainicjowany już w przeszłości. – Clara

+0

Należy ustawić atrybuty w modelu lub poprzez wysłanie zapytania o aktualizację. – Ross

+0

Ok. A jeśli ustawię atrybuty w modelu - i zakładam, że są one poprawione, jak wygląda zapytanie aktualizacji, na wypadek gdyby nie wiedziałem z góry, które pola chcę aktualizować, a ja po prostu je jako json? – Clara

0

Normal MongoEngine. W moim przypadku otrzymuję formularz z x-editable, który ma pola o tej samej nazwie co mój schemat, dzięki czemu mogę przejść bezpośrednio do bazy danych.

ActivityType.objects.filter(id=request.form['pk']).update(**{'set__'+request.form['name']: request.form['value']}) 
Powiązane problemy