【问题标题】:Mongoose return entair object and some elements in array which matched some requirementsMongoose 返回 entair 对象和数组中符合某些要求的某些元素
【发布时间】:2017-04-30 14:45:47
【问题描述】:

我在 mongodb 中有一个对象。我想使用状态过滤他们的部分。如果状态为active,则只需将其发送给用户。

课程架构的结构是:

{
   _id: 'ObjectId',
   name: 'NODE JS',
   .
   .
   sections: [
      {status: 'active', trainer: 'XYZ'}, {status: 'inactive', trainer: 'YZX'}, .....
   ]
}

'sections.status': 'active' 下方可以正常过滤课程,但它会返回所有不活动的部分。如何在猫鼬查询本身中过滤数组。不处理查询结果。

Course.findOne({ _id: req.params.id , 'sections.status': 'active' })
  .exec((err, course) => {
    if (err) {
      logger.error(err);
      res.status(500).json({ success: false, message: 'Error in getting data' });
    } else if (!course) {
      res.status(404).json({ success: false, message: 'No course details found' });
    } else {
      res.json({ success: true, course });
    }
  });

【问题讨论】:

  • 您希望响应包含架构中的所有数据,唯一的区别是删除不活动的sections
  • @Mike 是的。你说的是真的。
  • 我不相信您可以使用 Mongoose 从文档中删除数据而不写入数据库本身。我想你说你不想在你的回答中这样做,但你可能做的最好的事情是手动从sections 中删除不活动的项目,并在响应中发送修改后的对象。请参阅此处以获取参考:stackoverflow.com/questions/14504385/…

标签: node.js mongodb mongoose


【解决方案1】:

您不能让 Mongoose 为您返回修改后的文档而不将其写入数据库。但是,您可以使用 lean 函数让 Mongoose 返回一个对象字面量,而不会增加完整模型本身的开销,并根据您希望随数据一起发送的方式修改该对象。

Course.findOne({ _id: req.params.id , 'sections.status': 'active' })
  .lean()
  .exec((err, course) => {
    if (err) {
      logger.error(err);
      res.status(500).json({ success: false, message: 'Error in getting data' });
    } else if (!course) {
      res.status(404).json({ success: false, message: 'No course details found' });
    } else {

      // Remove all 'inactive' sections
      course.sections = course
                          .sections
                          .filter((section) => section.status === 'active')

      res.json({ success: true, course });
    }
  });

请参阅以下帖子以获取参考。

Why can't you modify the data returned by a Mongoose Query (ex: findById)

【讨论】:

  • 谢谢。到目前为止,我一直在使用 Promise 过滤它,因为我不知道 lean() 方法。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多