如何使用Mongoengine删除嵌入式文档?

问题描述:

我有一个具有EmbeddedDocumentField的集合。我无法找到如何从集合中删除嵌入文档的示例。有人能给我提供一个例子或参考吗?如何使用Mongoengine删除嵌入式文档?

这里是我的设置是什么样子:

  • 的Python 2.7.5
  • 的Django 1.5.5
  • MongoEngine 0.8.7

代码:

class Merchant(Document): 
    merchant_id = StringField(max_length=50) 
    merchant_name = StringField(max_length=150) 
    merchant_name_search_alias = StringField(max_length=150) 
    website = StringField(max_length=150) 
    location = ListField(EmbeddedDocumentField(Location)) 
    address = StringField(max_length=50) 
    city = StringField(max_length=30) 
    state = StringField(max_length=20) 
    zipcode = IntField() 
    phone_nummber = StringField(max_length=10) 
    sub_lat = FloatField() 
    sub_lng = FloatField() 
    country = StringField(max_length=20) 
    promotion = ListField(EmbeddedDocumentField(Promotion)) 


class Promotion(EmbeddedDocument): 
    provider_name = StringField(max_length=50) 
    provider_website = URLField() 
    promo_name = StringField(max_length=300) 
    promo_name_search_alias = StringField(max_length=100) 
    retail_price = DecimalField(precision=2, force_string=True) 
    discount_price = DecimalField(precision=2, force_string=True) 
    deal_url = URLField() 
    buy_url = URLField() 
    deal_image_url = URLField() 
    description = StringField(max_length=1000) 
    start_at = DateTimeField() 
    end_at = DateTimeField() 
    category = StringField(max_length=50) 
    dq_category = StringField(max_length=50) 
    keywords = StringField(max_length=100) 
+0

你能只更新外文件和设置嵌入文档为空? AFAIK嵌入式文档只是一个恰好是子树的字段。 – 9000

+0

我还没有尝试过,但似乎会工作。我是MongoDB和MongoEngine的新手,所以不确定是否有一个“正确”的方式来做到这一点。谢谢! –

您可以$unset a fiel d。使用MyDoc.objects.update(unset__myField=1) 或者用$pull删除从列表例如,单个值:MyDoc.objects.update(pull__myField=Value)

参见:http://docs.mongoengine.org/en/latest/guide/querying.html?highlight=unset#atomic-updates

+0

真棒谢谢罗斯! –

+0

@罗斯你能帮我[这个](http://*.com/questions/26151632/removing-a-column-from-a-dictfield-in-mongodb-flask-mongoengine)? –