【问题标题】:Mongoose/MongoDb find documents with reverse reference in an arrayMongoose/MongoDb 在数组中查找具有反向引用的文档
【发布时间】: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


【解决方案1】:

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

Order
- salerId
- buyerId
- date

OrderItem
- orderId
- name
- price
- discount

【讨论】:

  • 我认为这是最好的主意。我没有想到要进行另一个查询,我只需将 orderId 存储在 OrderItem 中,然后使用 orderId = o1 检索订单。只是当时没有点击到我!感谢您引起我的注意..
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 2012-01-08
  • 2015-09-02
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多