mongodb 如何在mongo数据库中获取对象数组中的数据

toiithl6  于 2023-01-25  发布在  Go
关注(0)|答案(1)|浏览(115)

我正在一个MERN项目中工作,我想通过inside objectid从对象数组内部获取数据。

我的模型视图

我想通过objectid:"63cbb3b15cd59c7810ab89a2获取name:"vikash"attendance:"present"
我尝试了以前stackoverfow解决方案中的两种方法,但它们对我不起作用

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

第二个是

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

两个代码的输出均为[]

3htmauhk

3htmauhk1#

你的代码中还有一个打字错误,参数名是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 stage--它告诉mongo你想要返回什么,我写了_id: 0,它告诉mongo你不想返回document's _id字段,然后$filter stage有一个input字段,它告诉mongo过滤什么--在我们的例子中是projectmembers.在$as字段中是projectmembers数组中每一项的变量名,我把它命名为projectMember,你可以随意命名它,然后我们可以通过变量projectMember访问每一项,在我们的条件语句中,我们传递了一个条件,它检查projectmembers阵列中是否有任何等于req.params.id$$projectMember._id(在eq条件下,我们用两个$$作为projectMember.id的前缀以便访问它)。
要访问ObjectId,您需要将其导入到文件的顶部:

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

最后,您还可以在Mongo Playground中看到mongo聚合是如何工作的,并可以尝试使用它。

相关问题