Node.js 如何在MongoDB聚合中查找内部查找?

Node.js 如何在MongoDB聚合中查找内部查找?,node.js,database,mongodb,mongoose,Node.js,Database,Mongodb,Mongoose,我有一个简单的3集。这是他们的伪代码。我想得到所有的货物,对于每一批货物,我想有该批货物的所有出价,在每个出价中,我需要userDetails对象 User: { name: string, } Shipment: { from: string, to: string } Bid: { amount: number, shipmentId: Ref_to_Shipment userId: Ref_to_User } 这就是我尝试过的: const shipments

我有一个简单的3集。这是他们的伪代码。我想得到所有的货物,对于每一批货物,我想有该批货物的所有出价,在每个出价中,我需要userDetails对象

User: {
  name: string,
}

Shipment: {
  from: string,
  to: string
}

Bid: {
  amount: number,
  shipmentId: Ref_to_Shipment
  userId: Ref_to_User
}
这就是我尝试过的:

const shipments = await ShipmentModel.aggregate([
            {
                $lookup: {
                    from: "bids",
                    localField: "_id",
                    foreignField: "shipmentId",
                    as: "bids"
                }
            },
            {
                $lookup: {
                    from: "users",
                    localField: "bids.userId",
                    foreignField: "_id",
                    as: "bids.user"
                }
            }
        ])
我得到了以下结果:

[
    {
        "_id": "5fad2fc04458ac156531d1b1",
        "from": "Belgrade",
        "to": "London",
        "__v": 0,
        "bids": {
            "user": [
                {
                    "_id": "5fad2cdb4d19c80d1b6abcb7",
                    "name": "Amel",
                    "email": "Muminovic",
                    "password": "d2d2d2",
                    "__v": 0
                }
            ]
        }
    }
]
我正试图得到他们的出价和出价内的用户所有装运数据应类似于

[
    {
        "_id": "5fad2fc04458ac156531d1b1",
        "from": "Belgrade",
        "to": "London",
        "__v": 0,
        "bids": [
            {
                "_id": "5fad341887c2ae1feff73402",
                "amount": 400,
                "userId": "5fad2cdb4d19c80d1b6abcb7",
                "shipmentId": "5fad2fc04458ac156531d1b1",
                "user": {
                    "name": "Amel",
                }
                "__v": 0
            }
        ]
    }
]

请尝试使用以下代码:

const shipments = await ShipmentModel.aggregate([
            {
                $lookup: {
                    from: "bids",
                    localField: "_id",
                    foreignField: "shipmentId",
                    as: "bids"
                }
            },
            {
              $unwind: {
                path: "$bids",
                preserveNullAndEmptyArrays: true
              }
            },
            {
                $lookup: {
                    from: "users",
                    localField: "bids.userId",
                    foreignField: "_id",
                    as: "bids.user"
                }
            }
        ])
如果要防止空数组和空数组,请设置

preserveNullAndEmptyArrays: false
尝试查询并检查是否有效,行为是否符合您的预期:

db.shipping.aggregate([
{
$lookup:{
从:“投标”,
localField:“id”,
foreignField:“shipmentId”,
as:“投标”
}
},
{
$lookup:{
发件人:“用户”,
localField:“id”,
外域:“id”,
as:“新手”
}
},
{
$项目:{
“newBids.id”:0,
“newBids.\u id”:0,
}
},
{
$match:{
“bids.userId”:1
}
},
{
$addFields:{
“新手”:{
“$arrayElemAt”:[
“$newBids”,
0
]
}
}
},
{
$set:{
“bids.user”:“$newBids”
}
},
{
$项目:{
“newBids”:0
}
}
])
此查询执行双重
$lookup
,然后执行
$project
以删除不需要的字段,并查找
用户ID
以添加字段
用户
。当
$lookup
生成数组时,需要使用
arrayElemAt
获取第一个位置

然后,
$set
此值作为
出价生成到对象中。用户
并删除旧值


请注意,我使用了一个新字段
id
,而不是
\u id
,以便更轻松地读取数据。

这样,我就可以为每一次无意中的出价获得发货。我可以有10个出价在一批货,所以我会得到10批货与出价作为对象,而不是数组?