首页 > 解决方案 > 如何在 MongoDB Aggregate 中查找内部查找?

问题描述

我有一个简单的 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
            }
        ]
    }
]

标签: node.jsdatabasemongodbmongoose

解决方案


尝试使用以下代码:

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

推荐阅读