Mongoose - 链接到相同类型的嵌套子文档

Posted

技术标签:

【中文标题】Mongoose - 链接到相同类型的嵌套子文档【英文标题】:Mongoose - Nested SubDocuments linked to same type 【发布时间】:2019-10-19 10:38:51 【问题描述】:

我的结构如下:

--> means is included in (as property):
Item --> ItemStack <--> Inventory

Item: name: string, weight: number, ...
ItemStack: item: Item, amount: number, inventory: Inventory | null
Inventory: items: ItemStack[], capacity: number

一个项目是一些项目的一般定义。 ItemStack 具有对项目的引用以及这些项目的数量。但是,一个物品可以是一个背包,一个背包可以有一个库存。因此,ItemStack 也有一个 Inventory 作为子文档。然后 Inventory 存储一个 ItemStacks 数组。这就是问题所在,因为 ItemStack 和 Inventory 不应该有自己的集合,因为它们不是多对多关系,最好将它们存储为子文档。问题来了,因为这可能被视为循环引用,但这是永远不会发生的。

这就是它实际的样子(从数据库中检索时):

Item 
  id: 1,
  name: "Apple",
  weight: 1

Item 
  id: 2,
  name: "Backpack",
  weight: 10


InventoryHolder 
  Inventory 
    capacity: 10,
    items: [
      Item 
        id: 1,
        name: "Apple"
      ,
      Item 
        id: 2,
        name: "Backpack",
        inventory: Inventory  // the point of circular reference
          items: [] // as many more items in backpacks as needed
        
      
    ]
  

但是,由于库存只能由一个持有者或物品持有或拥有,最好将它们存储为子文档。

我现在的问题是如何定义模型以使结构像这样工作。

提前致谢!

编辑: 我尝试过使用 Typegoose,它可以让我为模型定义类。 根据将它们作为子文档,这就是我尝试设置它们的方式:

class TSItem extends Typegoose 
    @prop()
    name?: string;
    @prop()
    weight?: number;
    @prop()
    canHaveInventory?: boolean;


class TSItemStack extends Typegoose 
    @prop()
    item?: TSItem;
    @prop()
    inventory?: TSInventory;
    @prop()
    amount?: number;


class TSInventory 
    items?: TSItemStack[];
    capacity?: number;

    constructor()
        this.items = [];
        this.capacity = 10;
    

然而,当编译它时,我显然得到了这个错误:

ReferenceError: TSInventory is not defined

... 因为我试图在它被定义之前使用它。这正是问题所在。类型本身是循环关系,但是在将其应用于真实数据时,这永远不会发生。

【问题讨论】:

【参考方案1】:

设法简单地使用“对象”作为递归/循环引用的类型。

之后需要我进行一些类型转换,但它有效! 似乎无法以任何其他方式解决问题。

【讨论】:

以上是关于Mongoose - 链接到相同类型的嵌套子文档的主要内容,如果未能解决你的问题,请参考以下文章

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

使用具有相同名称的嵌套子属性展平 Spark JSON 数据框

我的嵌套子查询和 substr 函数有啥问题

Polymer 1.0 通配符绑定到数组中的嵌套子属性

猫鼬中的嵌套子模式

::slotted CSS 选择器用于 shadowDOM 插槽中的嵌套子级