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

Mongoose - Nested SubDocuments linked to same type

我的结构如下:

--> 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

一个Item是一些Item的一般定义。 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

... 因为我在定义之前尝试使用它。这就是确切的问题。类型本身处于循环关系中,但是当将其应用于实际数据时,这永远不会发生。

设法简单地使用 "Object" 作为 recursion/circular 引用的类型。

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