如何在Mongoose中获取子文档Schema的父文档数据?
解决Mongoose子文档访问父文档数据的问题
我太懂这种踩坑的感觉了——在Mongoose里子文档想拿父文档的数据,试了几种方法要么报错要么没用,确实头疼。你之前用的$parent是Mongoose内部的私有属性,官方不推荐直接依赖;而this.parent()导致栈溢出,大概率是因为虚拟属性的getter调用它时触发了循环引用。
给你个靠谱的解决方案:用Mongoose官方提供的ownerDocument()方法,这是专门为子文档设计的安全获取父文档实例的API。
修改你的虚拟属性代码就行:
Participant.virtual('url').get(function url() { // 通过ownerDocument()拿到父Event文档实例 const parentEvent = this.ownerDocument(); return `/${parentEvent.id}/participants/${this.id}`; });
为啥这个方法好使?
ownerDocument()是官方维护的稳定API,不像$parent那样属于内部实现,随时可能变动。- 它直接返回父文档的引用,不会触发额外的属性 getter,自然也就不会出现循环引用导致的栈溢出问题。
额外提醒:
- 这个方法只有当Participant子文档已经嵌入到Event文档实例中时才有效,如果是单独创建的Participant实例,
ownerDocument()会返回null,你可以根据业务需求加个判断逻辑。 - 要确保Participant确实是正确嵌入在Event的
applications数组字段里,不然也拿不到父文档哦。
内容的提问来源于stack exchange,提问作者serge1peshcoff
相关产品推荐
相关产品推荐

