我是MongoDB的新手,正在try 从不同的集合中获取每个子元素的subjectidcompletestatus的所有主题.

我在$lookup岁之后没有得到合适的结果.在这里,从主集合获取根据subject的所有主题详细信息,然后我想用这个表来查找那个特定的子 node 是否完成了该主题,但studenttopic字段的值为空[].

db = {
  "edchildrevisioncompleteschemas": [
    {
      "_id": "659580293aaddf7594689d18",
      "childid": "WELL1703316202984",
      "subjectDetails": [
        {
          "subjectid": "1691130406151",
          "subject": "English",
          "completestatus": "false",
          "topicDetails": [
            {
              "topicid": "1691144002706",
              "topic": "The Monkey from Riger",
              "completestatus": "true"
            },
            {
              "topicid": "1691154462501",
              "topic": "The Little Round Bun (1)",
              "completestatus": "true"
            }
          ]
        },
        {
          "subjectid": "1691133599736",
          "subject": "ସାମାଜିକ ବିଜ୍ଞାନ",
          "completestatus": "false",
          "topicDetails": [
            {
              "topicid": "1691561384319",
              "topic": "ସାମାଜିକ ଶୃଙ୍ଖଳା",
              "completestatus": "true"
            }
          ]
        }
      ]
    },
    {
      "_id": "659580293aaddf7594689d18",
      "childid": "WELL170331620298978",
      "subjectDetails": [
        {
          "subjectid": "1691130406151",
          "subject": "English",
          "completestatus": "false",
          "topicDetails": [
            {
              "topicid": "1691144002706",
              "topic": "The Monkey from Riger",
              "completestatus": "true"
            }
          ]
        }
      ]
    }
  ],
  "edcontentmaster": [
    {
      "_id": {
        "$oid": "64ccd53792362c7639d3da5f"
      },
      "contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey from RigerLesson - 1",
      "boardid": "1",
      "boardname": "BSE",
      "scholarshipid": "NVOOKADA1690811843420",
      "scholarshipname": "Adarsh",
      "stageid": "5",
      "subjectid": "1691130406151",
      "stage": "STD-5",
      "subject": "English",
      "subjectimage": "https://notevook.s3.ap-south-1.amazonaws.com/Adarsh/sub+english.png",
      "topicimage": "",
      "contentimage": "",
      "topicid": "1691144002706",
      "topic": "The Monkey from Riger",
      "slcontent": "1",
      "sltopic": "1",
      "contentset": "Lesson - 1",
      "timeDuration": "15",
      "quiz": [],
      "slsubject": "1"
    },
    {
      "_id": {
        "$oid": "64ccf5ca92362c7639d3f145"
      },
      "contentid": "NVOOKADA1690811843420STD-5EnglishThe Monkey from RigerLesson - 3",
      "boardid": "1",
      "boardname": "BSE",
      "scholarshipid": "NVOOKADA1690811843420",
      "scholarshipname": "Adarsh",
      "stageid": "5",
      "subjectid": "1691130406151",
      "stage": "STD-5",
      "subject": "English",
      "subjectimage": "https://notevook.s3.ap-south-1.amazonaws.com/Adarsh/sub+english.png",
      "topicimage": "",
      "contentimage": "",
      "topicid": "1691144002706",
      "topic": "The Monkey from Riger",
      "slcontent": "3",
      "sltopic": "1",
      "contentset": "Lesson - 3",
      "timeDuration": "5",
      "quiz": [],
      "isPremium": true,
      "videos": [],
      "concepts": [],
      "slsubject": "2"
    }
  ]
}

$lookup码:

edcontentmaster
.aggregate([
  {
    $match: {
      stageid: stageid,
      subjectid: subjectid,
      boardid: boardid,
      scholarshipid: scholarshipid,
    },
  },
  {
    $addFields: {
      convertedField: {
        $cond: {
          if: { $eq: ["$slcontent", ""] },
          then: "$slcontent",
          else: { $toInt: "$slcontent" },
        },
      },
    },
  },
  {
    $sort: {
      slcontent: 1,
    },
  },
  {
    $group: {
      _id: "$topic",
      topicimage: { $first: "$topicimage" },
      topicid: { $first: "$topicid" },
      sltopic: { $first: "$sltopic" },
      studenttopic: { $first: "$studenttopic" },
      reviewquestionsets: {
        $push: {
          id: "$_id",
          sub: "$sub",
          topic: "$topic",
          contentset: "$contentset",
          stage: "$stage",
          timeDuration: "$timeDuration",
          contentid: "$contentid",
          studentdata: "$studentdata",
          subjectIamge: "$subjectIamge",
          topicImage: "$topicImage",
          contentImage: "$contentImage",
          isPremium: "$isPremium",
        },
      },
    },
  },
 {
    $lookup: {
      from: "edchildrevisioncompleteschemas",
      let: { childid: childid, subjectid:subjectid,topicid:"$topicid" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$childid", "$$childid"] },
                { $eq: ["$subjectDetails.subjectid", "$$subjectid"] },
              { $eq: ["$subjectDetails.topicDetails.topicid", "$$topicid"] },
              ],
            },
          },
        },
        {
          $project: {
            _id: 1,
            childid: 1
          },
        },
      ],
      as: "studenttopic",
    },
  },
  {
    $project: {
      _id: 0,
      topic: "$_id",
      topicimage: 1,
      topicid: 1,
      sltopic: 1,
      studenttopic:1,
      contentid: "$contentid",
      reviewquestionsets: 1,
    },
  },
])

在一个主题下,有多个测试可用,因此在单个topicid个测试中,我们可能会找到一个或多个文档,这就是我将它们按topicid分组的原因.

推荐答案

你的第二和第三个条件不起作用:

  1. subjectid变量与作为数组的subjectDetails.subjectid字段进行比较.

  2. topicid变量与作为嵌套数组的字段subjectDetails.topicDetails.topicid进行比较.

因此,每个问题的解决方案如下:

  1. 使用$in运算符判断subjectDetails.subjectid数组中的subjectid变量.

  2. 使用$in运算符判断Flatten subjectDetails.topicDetails.topicid数组中的topicid变量.

{
  $lookup: {
    from: "edchildrevisioncompleteschemas",
    let: {
      childid: childid,
      subjectid: subjectid,
      topicid: "$topicid"
    },
    pipeline: [
      {
        $match: {
          $expr: {
            $and: [
              {
                $eq: [
                  "$childid",
                  "$$childid"
                ]
              },
              {
                $in: [
                  "$$subjectid",
                  "$subjectDetails.subjectid"
                ]
              },
              {
                $in: [
                  "$$topicid",
                  {
                    $reduce: {
                      input: "$subjectDetails",
                      initialValue: [],
                      in: {
                        $concatArrays: [
                          "$$value",
                          "$$this.topicDetails.topicid"
                        ]
                      }
                    }
                  }
                ]
              }
            ]
          }
        }
      },
      ...
    ],
    as: "studenttopic"
  }
}

Demo @ Mongo Playground

Node.js相关问答推荐

在child_Process中持久运行SSH命令

Sveltekit停靠的应用程序找不到从Build导入的包

如何修复PostgreSQL和NodeJS/NestJS应用程序之间的日期时间和时区问题?

我的 React + Express 应用程序不断向我的数组添加一个空对象

Mongodb - 在数组数组中查找()

有没有办法判断 UUID 是否是使用 node.js 中的特定命名空间生成的?

错误 node :错误:绑定消息提供 16 个参数,但准备语句需要 15 个

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

对 google api v3 的 Axios 请求返回加密(?)数据

是Electron 的密码和登录凭据的安全存储吗?

Cypress net::ERR_EMPTY_RESPONSE 在真实服务器调用上

适用于 Windows 7 的 NodeJS

将 myproject/.npmrc 与注册表一起使用

无法获取 CSS 文件

为什么我们要为 Angular 2.0 安装 Node.js?

tsconfig.json 中模块类型的区别

如何从 findOneAndUpdate 方法中获取更新的文档?

Mongoose - 保存字符串数组

在 react-router v4 中使用 React IndexRoute

Meteor - collection.find() 总是返回所有字段