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

7 投票
2 回答
6489 浏览
提问于 2025-04-17 21:14

我有一个集合,其中包含一个嵌入文档字段。我在找如何从这个集合中删除嵌入文档的例子时遇到了困难。有没有人能给我一个例子或者指个参考?

这是我的设置情况:

  • 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)

2 个回答

1
user = User_.objects(username=username).get()
for ad in user.ads:
    if str(ad["_id"]) == id:
        user.ads.remove(ad)
user.save()

这是我找到的唯一一种从嵌套文档的数组中移除一个值的方法。

9

你可以用 $unset 来删除一个字段,比如可以这样写:MyDoc.objects.update(unset__myField=1)。这行代码的意思是把叫做 myField 的字段给删掉。

另外,你也可以用 $pull 来从一个列表中移除某个值,比如:MyDoc.objects.update(pull__myField=Value)。这行代码的意思是从 myField 这个列表里把指定的值给删掉。

想了解更多,可以查看这个链接:https://docs.mongoengine.org/guide/querying.html?highlight=unset#atomic-updates

撰写回答