[英]How to use aggregate with $lookup in Mongoose with foreign key in sub sub array?
我正在尝试在我的 express-mongo 项目中加入 3 个表。 我有一个名为 Product LIKE 的表:
Product:
_id:5f92a8dfad47ce1b66d4473b
name:"Freno 1"
createdFrom:5f648f7d642ed7082f5ff91f
category:5f92a00c4637a61a397320a1
description:"Freni di tutti i tipi"
sellingPrice:1050
purchasePrice:350
我必须在 sum 之后提取可用数量,并从其他 2 个表中减去数量: purchaseorders
和salesorders
purchaseorders
_id:5f930c6c6817832c0d5acbb4
items:[
{
_id:5f930c6c6817832c0d5acbb5
product:5f92abaf17ec621c1da4f4f9
quantity:10
purchasingPrice:1500
discount:300
},
{
_id:5f930c6c6817832c0d5acbb6
product:5f92a8dfad47ce1b66d4473b
quantity:7
purchasingPrice:1500
discount:300
}]
salesorders
_id:5f930c6c6817832c0d5acbb4
items:[
{
_id:5f930c6c6817832c0d5acbb5
product:5f92abaf17ec621c1da4f4f9
quantity:3
sellingPrice:1500
discount:300
},
{
_id:5f930c6c6817832c0d5acbb6
product:5f92a8dfad47ce1b66d4473b
quantity:3
sellingPrice:1500
discount:300
}]
Purchaseorders
订单和salesorders
被设计为在同一订单中包含不同的产品。 我正在尝试合并这 3 个表以获得如下结果:
[
{_id: 5f92a8dfad47ce1b66d4473b,
name: "Freno 1",
quantity: 4 },
etc.. with all other products
]
我想对purchaseorders
订单中的所有数量求和并减去销售订单的数量salesorders
。
我正在尝试使用从 Product 表开始的聚合,如下所示:
let result = await Product.aggregate([
{
$lookup: {
from: "purchaseorders",
localField: "_id",
foreignField: "items.product",
as: "purchaseorders"
}
},
{
$lookup: {
from: "salesorders",
localField: "_id",
foreignField: "items.product",
as: "salesorders"
}
},
{
$unwind: "$purchaseorders"
},
{
$unwind: "$purchaseorders.items"
},
{
$unwind: "$salesorders"
},
{
$unwind: "$salesorders.items"
},
{
$group: {
_id: "$_id"
}
}
])
感谢谁试图帮助我!
你可以试试,
$addFields
添加quantity
字段,$reduce
迭代purchaseorders
订单循环,$reduce 迭代项目循环并获取匹配产品的数量和 $add 初始值为 reduce$reduce
迭代salesorders
循环,$reduce 迭代项目循环并获取匹配产品的数量和 $add 初始值为 reduce$subtract
采购订单的数量let result = await Product.aggregate([
// skipped { $lookup },
// skipped { $lookup },
{
$project: {
_id: 1,
name: 1,
quantity: {
$subtract: [
{
$reduce: {
input: "$purchaseorders",
initialValue: 0,
in: {
$add: [
"$$value",
{
$reduce: {
input: "$$this.items",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this.product", "$_id"] },
{ $add: ["$$value", "$$this.quantity"] },
"$$value"
]
}
}
}
]
}
}
},
{
$reduce: {
input: "$salesorders",
initialValue: 0,
in: {
$add: [
"$$value",
{
$reduce: {
input: "$$this.items",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this.product", "$_id"] },
{ $add: ["$$value", "$$this.quantity"] },
"$$value"
]
}
}
}
]
}
}
}
]
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.