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 中的嵌套子文档