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

时间:2019-06-03 21:25:26

标签: node.js typescript mongoose nested subdocument

我的结构如下:

--> 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还具有一个清单作为子文档。然后,库存会存储一个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 个答案:

答案 0 :(得分:0)

仅使用“对象”作为递归/循环引用的类型即可。

之后将要求我进行一些类型转换,但是它可以工作! 似乎无法以其他任何方式解决问题。