我在一个MERN项目中工作,我想通过内部的OBJECTID从对象数组内部获取数据.

My model view

enter image description here

I want to fetch 100 and 101 through the 102

I had tried two types of methods from previous 100 solution but they didn't work for me

app.get('/stud/:id', (req, res) => {
    ProjectSchema.find({"projectmembers._id":req.params._id}, (err, data) => {
        if (err) return res.status(500).send(err);
        res.status(200).send(data);
    });
})

the second one is

app.get('/stu/:id', (req, res) => {
    ProjectSchema.aggregate([
        {
            $unwind:"$projectmembers"
        },
        {$match : {
            "projectmembers._id" : req.params._id
        }}
    ], (err, data) => {
        if (err) return res.status(500).send(err);
        res.status(200).send(data);
    });
})

The output of both code is 100

推荐答案

您的代码中也有一个打字错误.参数名称是id,因此应该是req.params.id而不是req.params._id-这可能是您收到空数组的原因.

对于您的情况,您可以将结果设置为filter,这样您就可以通过聚合只接收特定id的项目成员.

例如:

    app.get('/stu/:id', (req, res) => {
    
        try {
          const student = await ProjectSchema.aggregate([
  {
    $project: {
      _id: 0,
      projectmembers: {
        $filter: {
          input: "$projectmembers",
          as: "projectMember",
          cond: {
            $eq: [
              "$$projectMember._id",
              ObjectId(req.params.id)
            ]
          }
        }
      }
    }
  }
]);

      if (!student)
        return res.status(400).json({
          success: false,
          message: "No student exists with this ID",
        });
        
      return res.status(200).json({
        success: true,
        message: "Student Found",
        studentDetails: student,
      });
    } catch (err) {
      return res.status(500).json({
        success: false,
        message: "Error encountered whilst finding student",
        error: err,
      });
    }
  });

你可以看到有一个$project的阶段-它所做的是告诉Mongo你想要返回什么.我编写了_id: 0,它告诉mongo您不想返回document's _id字段.然后$filter阶段有一个input字段,它告诉mongo要过滤什么-在我们的例子中是projectmembers.在$as字段中是projectmembers数组中每一项的变量名称,我将其命名为projectMember-您可以随意命名它.然后,我们可以通过条件语句cond中名为projectMember的变量访问每个项.我们传递了一个$eq条件,它判断projectmembers数组中是否有等于req.params.id的任何$$projectMember._id(在eq条件中,为了访问它,我们在projectMember.id前面加上两个$$).

要访问该OBJECTID,您需要将其导入文件顶部:

const { ObjectId } = require("mongodb");

最后,您还可以在这里看到Mongo Playground的Mongo聚合是如何工作的,并对其进行操作.

Node.js相关问答推荐

Spotify Auth访问令牌给出错误代码400

如何在RavenDB中执行JS索引?

Inno Setup如何在现有文本文件中追加新内容

使用更新版本仍然找到包@angular/fire但不支持原理图

如何获取文件的中间值?

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

使用 fs.createWriteStream 将数据写入 bigquery (node.js) 时出现模式错误

在快速路由中使用 axios 会在数据字段中返回特殊字符而不是 json

为什么我的 npm 脚本中的 glob 不起作用?

try 在 Heroku 中部署 PRN 应用程序并获得 404

使用 .pipe(res) 向客户端发送音频不允许您搜索?

NestJS 共享模块的问题

MERN 堆栈项目中的 React [create-react-app] 正在提供依赖项

如何promise AWS JavaScript 开发工具包?

您如何写入 aws lambda 实例的文件系统?

Nodejs-console.error vs util.debug

如何使用 mocha.js 模拟用于单元测试的依赖类?

Node.js 应用程序有周期性的缓慢和/或超时(不接受传入的请求)

Node.js - 判断是否安装了模块而不实际需要它

为什么 Node.js 没有原生 DOM?