【发布时间】:2021-06-06 23:30:48
【问题描述】:
我有 2 个架构:
Order
- orderId
- date
- items: OrderItem[] (Array of ObjectIds of OrderItem)
OrderItem
- name
- price
- discount
现在我有了订单商品列表,我想将它们与订单相关联。
因为我将引用存储在Order。
但我需要在一个单独的页面中列出所有 OrderItems,我可以通过 API 将这些项目链接到订单。因此,我需要查看哪些商品已与订单相关联,哪些商品仍处于待处理状态。有没有什么方法可以使用猫鼬获得OrderItem列表中的OrderId?
我还尝试通过在 OrderItem 架构中包含 orderId 来反向引用 OrderItem 中的引用。但是,当我尝试链接已经链接的订单项目时,它会导致问题。
例如,我有 2 个订单:
o1:
items: i1, i2
o2:
items: i3, i4, i5
i1:
orderId: o1
i2:
orderId: o1
i3:
orderId: o2
i4:
orderId: o2
i5:
orderId: o2
i6:
orderId: o2
所以从项目列表中,用户选择 i2、i3 链接到 o3。然后必须进行以下更新:
o3 -> items: i2, i3
i2 -> orderId: o3
i3 -> orderId: o3
但它留下了o1 仍然持有i2 和o2 仍然持有i3 的情况。这些文件也需要更新。这么多操作留下了一个问题,简单的链接会导致复杂的模棱两可的情况。
如果有办法我可以获取项目列表和 orderId 它所属的列表,而无需将 orderId 存储在 OrderItem 中,而仅将其存储在 Order.items 中可以解决这种情况。
有什么方法可以用 mongoose / mongodb 实现这一点吗?
【问题讨论】:
-
如何使用
$unwind和$lookup直接查询订单集合以列出所有项目。 -
猫鼬方式是加载订单和populate商品。作为不将项目从一个订单移动到另一个订单的一方很复杂,因为对于您当前的模式,您必须更新 3 个订单的数组,如果您不使用多文档事务,这会为竞争条件留下很大的空间。
标签: node.js mongodb mongoose nestjs