【问题标题】:Deleting a Reference in a MongoEngine ListField?删除 MongoEngine ListField 中的引用?
【发布时间】:2020-07-20 00:01:24
【问题描述】:

我有映射以下关系的 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中的条目?

【问题讨论】:

    标签: mongodb orm mongoengine


    【解决方案1】:

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

    char = db.Character.objects()[0]
    objid = char.pk
    char.delete()
    
    user = db.UserInfo.objects().update_one(pull__allcharacters=objid)
    

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

    愿未来的一代能从中找到慰藉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多