首页 > 解决方案 > 删除 MongoEngine ListField 中的引用?

问题描述

我有映射以下关系的 Mongoengine ORM(简化):

class UserInfo(mg.Document):
    username = mg.StringField()
    allcharacters = mg.ListField(mg.ReferenceField("Character"))
    pass

class Character(mg.Document):
    charid = mg.IntField()
    pass

用户指的是对字符的引用数组。问题是当我访问用户的 allcharacter 数组并删除一个引用时:

for x in db.UserInfo.objects(username = session["user"])[0].allcharacters:
    if x.charid == someint:
        x.delete()

有问题的文档被删除,但数组中的引用仍然存在,指向不再存在的文档。

我尝试过了

allcharacters = mg.ListField(
    mg.ReferenceField("Character"), reverse_delete_rule=mg.CASCADE)

但这似乎无济于事。

如何删除 Mongoengine 中 ListField(ReferenceField) 的 ListField 中的条目?

标签: mongodbormmongoengine

解决方案


指导后代:为了在删除实际引用后从数组中删除引用元素,需要使用$pull操作。

char = db.Character.objects()[0]
objid = char.pk
char.delete()

user = db.UserInfo.objects().update_one(pull__allcharacters=objid)

获取指向要删除的特定引用的变量。使用该.pk属性来获取它的 ObjectId。您现在可以删除该文档。要删除文档中数组中的引用,这是一个拉查询,如果objid是在数组中allcharacters

愿后人能从中得到慰藉。


推荐阅读