Mongoose/MongoDb 在数组中查找具有反向引用的文档

Posted

技术标签:

【中文标题】Mongoose/MongoDb 在数组中查找具有反向引用的文档【英文标题】:Mongoose/MongoDb find documents with reverse reference in an array 【发布时间】: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 仍然持有i2o2 仍然持有i3 的情况。这些文件也需要更新。这么多操作留下了一个问题,简单的链接会导致复杂的模棱两可的情况。

如果有办法我可以获取项目列表和 orderId 它所属的列表,而无需将 orderId 存储在 OrderItem 中,而仅将其存储在 Order.items 中可以解决这种情况。

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

【问题讨论】:

如何使用$unwind$lookup直接查询订单集合以列出所有项目。 猫鼬方式是加载订单和populate商品。作为不将项目从一个订单移动到另一个订单的一方很复杂,因为对于您当前的模式,您必须更新 3 个订单的数组,如果您不使用多文档事务,这会为竞争条件留下很大的空间。 【参考方案1】:

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

Order
- salerId
- buyerId
- date

OrderItem
- orderId
- name
- price
- discount

【讨论】:

我认为这是最好的主意。我没有想到要进行另一个查询,我只需将 orderId 存储在 OrderItem 中,然后使用 orderId = o1 检索订单。只是当时没有点击到我!感谢您引起我的注意..

以上是关于Mongoose/MongoDb 在数组中查找具有反向引用的文档的主要内容,如果未能解决你的问题,请参考以下文章

从 Mongoose/MongoDB 中的数组中删除对象

Mongoose Mongodb 查询对象数组

将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中

在对象数组上使用 Mongoose / MongoDB $addToSet 功能

Mongoose MongoDB 找到数组字段中数组长度最小的那个

以角度(mongoose/mongodb)更新模型,特别是作为模型属性的对象数组