猫鼬 - 链接到相同类型的嵌套子文档
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 引用的类型。
之后需要我做一些类型转换,但它有效!
似乎无法以任何其他方式解决问题。
我的结构如下:
--> 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 引用的类型。
之后需要我做一些类型转换,但它有效! 似乎无法以任何其他方式解决问题。