MongoEngine
でEmbeddedDocumentListField
からドキュメントを削除する。
重要なのは、$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
コメント