Python MongoEngine リストフィールドから特定のドキュメントを削除する

MongoEngineEmbeddedDocumentListFieldからドキュメントを削除する。

重要なのは、$pullとその後のsaveだけ。

実行環境は以下。

  • Flask==1.0.2
  • flask-mongoengine==0.9.5

対象のドキュメントはこのような構造と仮定する。

# app/models.py
class Ingredient(db.EmbeddedDocument):
    name = db.StringField(max_length=255, required=True)
    quantity = db.StringField(max_length=30)

class Dish(db.Document):
    name = db.StringField(max_length=255, required=True)
    quantity = db.StringField(max_length=30)
    ingredients = db.EmbeddedDocumentListField('Ingredient')

ドキュメントを以下のように格納する。

from app.models import Ingredient
from app.models import Dish

d1 = Dish(name='ほうれん草のおひたし', quantity='4人分')
d1.ingredients.append(Ingredients(name='ほうれん草', quantity='400g'))
d1.ingredients.append(Ingredients(name='削りがつお又は炒り白ごま', quantity='適宜'))
d1.ingredients.append(Ingredients(name='だし', quantity='大さじ4'))
d1.ingredients.append(Ingredients(name='しょうゆ', quantity='大さじ1'))
d1.save()

d2 = Dish(name='鯖の味噌煮', quantity='4人分')
d2.ingredients.append(Ingredients(name='鯖(2枚におろしたもの)', quantity='1尾'))
d2.ingredients.append(Ingredients(name='わけぎ', quantity='6本'))
d2.ingredients.append(Ingredients(name='しょうが', quantity='40g'))
d2.ingredients.append(Ingredients(name='こぶ', quantity='10cm'))
d2.ingredients.append(Ingredients(name='酒、砂糖、みそ', quantity='各大さじ4'))
d2.save()

この状態から、d2.ingredientsこぶの項を削除するときは、

from app.models import Dish
# d2の取得
d2 = Dish.objects(name='鯖の味噌煮').first()

d2.update(pull__ingredients__name='こぶ')
# saveまでしないと反映されない。
d2.save()

とすれば良い。

この例じゃ削除することはあんまりないな…


$pullの参考: 2.5. Querying the database — MongoEngine 0.16.3 documentation

$pullの参考:$pull — MongoDB Manual

料理の参考: くり返し作りたいおかず決定版レシピ300 (主婦の友生活シリーズ)

コメント

タイトルとURLをコピーしました