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
仍然持有i2
和o2
仍然持有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/angularjs 中的评论数组中
在对象数组上使用 Mongoose / MongoDB $addToSet 功能