使用从一个模型填充到另一个模型来检索数组数据

问题描述

这里是我的 MongoDB 数据库的两个模型。

QuestionsInfo


{
    "_id": ObjectId("60e5f5fce2446faa95e6eca7"),"courseName": "ML","user": ObjectId("6087dc4c2ba7a828363c9fca"),"questions": [
        {
            "questionInput": {
                "question": "This is the first Question. `(a+b)^2` ",},"id": "aLC/QNz/AOLO9Fyj7oJT","createdAt": "2021-07-07T18:41:18.971Z"
        },{
            "questionInput": {
                "question": "This is the first Question. `(a+b)^2` ","id": "aLC/QNz/AOLO9Fyj7oJJ","createdAt": "2021-07-07T18:41:19.971Z"
        },{
            "questionInput": {
                "question": "This is the third Question.ΒΓ","id": "qPgd261wVGizOuR1b9RT","createdAt": "2021-07-07T18:46:25.203Z"
        }
    ]
}

ExamInfo

questionsInfoQuestionsInfo 模型的 ID。这是由 MongoDB 参考创建的。

{
    "_id": ObjectId("60e5f88159292f575c0ca17f"),"questionsId": [
        "aLC/QNz/AOLO9Fyj7oJT","aLC/QNz/AOLO9Fyj7oJJ"
    ],"questionsInfo": ObjectId("60e5f5fce2446faa95e6eca7"),}

我想使用填充到 QuestionsInfo 模型中,从 questionsId 中查找与 ExamInfo 列表匹配的问题。

我该怎么做?提前致谢。

解决方法

这是实现这一目标的方法。

{
    $lookup: {
      from: "questionsInfo",let: {
        qId: "$questionsInfo",internalQIds: "$questionsId"
      },as: "questionsInfo",pipeline: [
        // first match question info document
        {
          $match: {
            $expr: {
              $eq: [
                "$_id","$$qId"
              ]
            }
          }
        },// unwind all nested questions
        {
          $unwind: "$questions"
        },// match only required questions
        {
          $match: {
            $expr: {
              $in: [
                "$questions.id","$$internalQIds"
              ]
            }
          }
        },// regroup
        {$group: {
          _id: "$_id",courseName: {
            $first: "$courseName"
          },user: {
            $first: "user"
          },questions: {
            $push: "$questions"
          }
        }
      },]
  }
}

现在由于查找返回数组,您可以使用类似的方法从数组中取出问题信息。

{
  "$addFields": {
    "questionsInfo": {
      "$arrayElemAt": [
        "$questionsInfo",0
      ]
    }
  }
}

https://mongoplayground.net/p/lYQAUFyEUMr