2013-03-14 9 views
6

エレガント Webページからjsonとして受け取った既存のMongoDBドキュメントを更新する方法を探しています。問題は、どのフィールドが更新されるのか事前にわからないためです。set__を使用することはできません。MongoDBドキュメントで更新されるフィールドのjson表現しかありません。私はDynamicDocumentsを使用していますので、ドキュメントに新しいフィールドが設定されている可能性があります。 例:jsonからMongoengine DynamicDocumentを更新するには

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

とJSONように見えるかもしれ - 例えば:

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

または

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

を、私は、コンソールから簡単にそれを行う、またはpymongoを使用することができますが、私手動でsetattr(myDocInstance、nameOfField、val)を設定しない限り、Mongoengineを使用してこれを行う方法はわかりません。 ありがとう!

+0

純粋なスキルレスDBが必要な場合は、なぜ厳密なルールでORMを選択するのですか?あなたはpymongoを試してみるべきです。 – Denis

+1

私はドキュメントと埋め込みドキュメントの階層を持ち、必要なフィールドのセットを定義したいので、オプションのフィールドにはかなり柔軟性があります。 – Clara

+0

「ドキュメントと埋め込みドキュメントの階層」は、ORMではなく、必須フィールドのセットを定義する開発者としての仕事です。「Webアプリケーションについて話したら、ユーザーからフォームを検証するだけです。 – Denis

答えて

5

クラスを開始するとあなただけのデータを渡すことができます:

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

通話更新(推奨)のいずれかすることができ、既存のモデルを更新したり、モデルを変更して保存し呼び出すには。

例:

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

それとも

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

または

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

はい、しかし、私が必要とするのは、既存の**文書を修正することです。これはすでに過去に開始されています。 – Clara

+0

モデルに属性を設定するか、更新クエリを発行する必要があります。 – Ross

+0

モデルに属性を設定して固定していると仮定した場合、どのフィールドを更新したいのかわからない場合はどうすれば更新クエリがどのように見えるのですか? – Clara

0

ノーマルMongoEngine。私の場合、x-editableから、スキーマと同じ名前のフィールドを持つフォームを受け取るので、これでデータベースに直接行くことができます。

ActivityType.objects.filter(id=request.form['pk']).update(**{'set__'+request.form['name']: request.form['value']}) 
関連する問題