【问题标题】:Mongoose aggregate pipeline lookup and nested objectsMongoose 聚合管道查找和嵌套对象
【发布时间】:2020-07-16 02:53:45
【问题描述】:

我想与您分享我的问题。

所以我有 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" 
    }
]

所以我的目标是获得这样的数据:其中的问题列表,与问题相关的评估列表,以及在评估中我需要一个用户对象。像这样:

    [
        {
            "_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"
                    }
                ] 
            }
        ]
    }
]

我评价的用户正在合并,但这不是我想要的,我只是想要评价里面的用户的内部信息。

有什么建议吗?

【问题讨论】:

    标签: node.js mongodb mongoose aggregate


    【解决方案1】:

    您应该能够通过使用https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries 中所述的不相关子查询来使用嵌套的$lookup

    你的情况是:

    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"
          }
        }
    ]);
    

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2019-06-22
      • 2019-12-26
      • 2021-06-29
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多