首页 > 解决方案 > Mongoose/MongoDb 在数组中查找具有反向引用的文档

问题描述

我有 2 个模式:

Order
- orderId
- date
- items: OrderItem[] (Array of ObjectIds of OrderItem)

OrderItem
- name
- price
- discount

现在我有了订单项目列表,我想将它们与订单相关联。因为我将引用存储在Order.

但我需要OrderItems在一个单独的页面中列出所有内容,我可以在其中通过 API 将项目链接到订单。因此,我需要查看哪些商品已经与订单相关联,哪些商品仍处于待处理状态。有没有办法使用猫鼬获得OrderId列表?OrderItem

我也尝试通过在架构中OrderItem包含来反向引用。但是,当我尝试链接已经链接的订单项目时,它会导致问题。orderIdOrderItem

例如,我有 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可以解决这种情况。OrderItemOrder.items

有什么办法可以用 mongoose / mongodb 实现这一点?

标签: node.jsmongodbmongoosenestjs

解决方案


当从 orderItem 检索订单详细信息时,存储没有 orderId 的 orderItem 会导致您遇到问题。如您所想,将 orderItemId 存储在订单集合中并没有用。因为您可以从 orderItem 集合中获取它们。查询嵌套数据并不容易。尝试将它们全部排成一条线。只是我的观点。

Order
- salerId
- buyerId
- date

OrderItem
- orderId
- name
- price
- discount

推荐阅读