mongodb - 删除 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 中的条目?
解决方案
指导后代:为了在删除实际引用后从数组中删除引用元素,需要使用$pull
操作。
char = db.Character.objects()[0]
objid = char.pk
char.delete()
user = db.UserInfo.objects().update_one(pull__allcharacters=objid)
获取指向要删除的特定引用的变量。使用该.pk
属性来获取它的 ObjectId。您现在可以删除该文档。要删除文档中数组中的引用,这是一个拉查询,如果objid
是在数组中allcharacters
愿后人能从中得到慰藉。
推荐阅读
- c# - 当我将 Crystal Reports 与 SQL Server 连接时出现问题没有响应
- spring - 如何将请求数据从 Spring MVC 控制器传送到 Spring RestTemplate
- amazon-web-services - STS API 返回的 AWS_SESSION_TOKEN 的功能是什么?
- oauth - 使用 OAuth 时从哪里开始对活动资源的身份验证请求
- php - if(empty($var)) 之后没有触发 else 语句
- android - Android材质组件底部app栏截断
- python - 使用 Telethon 将消息转发到超级组
- node.js - 错误:“消息不是函数” - req.flash()
- javascript - Jquery $toggle(''slow") 显示闪烁/卡住的行为?
- python - How to create python imshow subplots with same pixel size