簡體   English   中英

Mongoose 聚合管道查找和嵌套對象

[英]Mongoose aggregate pipeline lookup and nested objects

我想和你分享我的問題。

所以我有 3 個實體需要在我的查詢中訪問:

評估:

    [
        {
            _id: 1,
            questionary: 1,
            subject: 1
        },
        {
            _id: 1,
            questionary: 1,
            subject: 2
        },
    ] 

用戶

[
    {
        _id: 1
        name: "John Doe",
        photo: "photo1.jpg"
    },
        {
        _id: 2
        name: "Paul Smith",
        photo: "photo2.jpg"
    },
]

提問的

[
    {
        _id: 1,
        title: "questionary 1",
        "date": "2020-02-08T00:00:00.000Z" 
    },
    {
        _id: 2,
        title: "questionary 2",
        "date": "2020-02-09T00:00:00.000Z" 
    }
]

所以我的目標是得到這樣的數據:其中的問題列表,與問題相關的評估列表,在評估中我需要一個用戶 object。 像這樣:

    [
        {
            "_id": "1",
            "title": "questionary 1",
            "evaluations": [
                {
                    "_id": "1",
                    "date": "2020-04-05T18:53:46.948Z"
                    "user": {
                        _id: 1,
                        "name": "John Doe",
                        "photo": "photo1.jpg"
                    }
                },
                {
                    "_id": "2",
                    "date": "2020-04-06T18:53:46.948Z",
                    "user": {
                        _id: 1,
                        "name": "John Doe",
                        "photo": "photo1.jpg"
                    }
                }
            ]
        }
    ]

我的查詢是:

return await Questionary.aggregate([{
      $lookup: {
        from: "evaluation", 
        localField: "_id",  
        foreignField: "questionary", 
        as: "evaluations",
      }
    },
    {
      $lookup: {
        from: "user",
        localField: "evaluations.user",
        foreignField: "_id",
        as: "user",
      }
    },
    { 
        $project: {
            _id: 1,
            title: 1,
            status: 1,
            evaluations: {
                _id: 1,
                date: 1,
                user: "$user"
            }
        },
    },
]);

我的結果是:

[
    {
        "_id": "1",
        "title": "questionary 1",
        "evaluations": [
            {
                "_id": "1",
                "date": "2020-04-05T18:53:46.948Z"
                "user": [
                    {
                        _id: 1,
                        "name": "John Doe",
                        "photo": "photo1.jpg"
                    },
                    {
                        _id: 2,
                        "name": "Paul Smith",
                        "photo": "photo2.jpg"
                    }
                ]
            },
            {
                "_id": "2",
                "date": "2020-04-06T18:53:46.948Z",
                "user": [
                    {
                        _id: 1,
                        "name": "John Doe",
                        "photo": "photo1.jpg"
                    },
                    {
                        _id: 2,
                        "name": "Paul Smith",
                        "photo": "photo2.jpg"
                    }
                ] 
            }
        ]
    }
]

我評價的用戶正在合並,但這不是我想要的,我只是想要評價里面的用戶的內部信息。

有什么建議嗎?

您應該能夠通過使用不相關的子查詢來使用嵌套的$lookup ,如https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-中所述查詢

在你的情況下,這將是:

return await Questionary.aggregate([{
      $lookup: {
        from: "evaluation",
        let: {questId: "$_id"},
        pipeline: [{
          $match: {
            $expr: {
              $eq: ["$$questId", "$questionary"]
            }
          },
        }, {
          $lookup: {
            from: "user",
            localField: "subject",
            foreignField: "_id",
            as: "user",
          }
        }],
        as: "evaluations"
      }
    }
]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM