Node.js 如何在Mongoose中使用aggregate with$lookup,并在子数组中使用外键?

Node.js 如何在Mongoose中使用aggregate with$lookup,并在子数组中使用外键?,node.js,mongodb,express,mongoose,lookup,Node.js,Mongodb,Express,Mongoose,Lookup,我正在尝试在我的express mongo项目中加入3个表。 我有一张名为Product的表格,如下所示: Product: _id:5f92a8dfad47ce1b66d4473b name:"Freno 1" createdFrom:5f648f7d642ed7082f5ff91f category:5f92a00c4637a61a397320a1 description:"Freni di tutti i tipi" sellingPrice:10

我正在尝试在我的express mongo项目中加入3个表。 我有一张名为Product的表格,如下所示:

Product:

_id:5f92a8dfad47ce1b66d4473b
name:"Freno 1"
createdFrom:5f648f7d642ed7082f5ff91f
category:5f92a00c4637a61a397320a1
description:"Freni di tutti i tipi"
sellingPrice:1050
purchasePrice:350
我必须在求和后提取可用数量,然后从其他两个表中减去数量:
purchaseorders
salesforders

purchaseorders

_id:5f930c6c6817832c0d5acbb4
items:[
{
_id:5f930c6c6817832c0d5acbb5
product:5f92abaf17ec621c1da4f4f9
quantity:10
purchasingPrice:1500
discount:300
},
{
_id:5f930c6c6817832c0d5acbb6
product:5f92a8dfad47ce1b66d4473b
quantity:7
purchasingPrice:1500
discount:300
}]
Purchaseorders
salesorders
设计为在同一订单中包含不同的产品。 我试图将这3个表组合起来,得到如下结果:

[
{_id: 5f92a8dfad47ce1b66d4473b,
name: "Freno 1",
quantity: 4 },
etc.. with all other products
]

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"
            }
        }
        ])
我想求
purchaseorders
中的所有数量之和,然后减去
salesforders
的数量之和

我尝试从产品表开始使用聚合,如下所示:

[
{_id: 5f92a8dfad47ce1b66d4473b,
name: "Freno 1",
quantity: 4 },
etc.. with all other products
]

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
    要添加
    数量
    字段
  • $reduce
    迭代
    采购订单的循环,$reduce迭代项目的循环,并获得匹配产品的数量和$add的初始值reduce
  • $reduce
    迭代销售订单的循环,$reduce迭代项目的循环,并获得匹配产品的数量和$add的初始值reduce
  • $subtract
    purchaseorders的数量与salesorders的数量

您好,谢谢您的回复。但是我需要一个唯一的对象数组作为结果,比如[{productId:xxx,quantity:xx},{productId:xxx,quantity:xx},…]是的。。问题是一个订单可能包含其他产品不,我不能,因为你的结果与我期望的不同哦,是的!!!非常感谢你!你能给我解释一下所有的步骤吗?你为什么不放松一下??