mongoose 条件查询?

问题描述

想要得到course字段中复合要求的一条数据,使用find后返回的数据包含多余数据,结果不理想。想要达到目的应该如何编写代码,初学moongse,似乎需要用到populate或者aggregate,这应该怎么写合适呢?谢谢!

相关代码

schema

const courseInf = new Schema({
    teacher:String,
    courseName:String,
});
const student = new Schema({
    name:String,                //姓名
    classname:String,                //班级
    stunum:String,                //学号
    oldpassword:String,           //旧密码
    newpassword:String,           //新密码
    phonenum:String,              //手机号
    course:[courseInf]           //课程
});

数据

{ _id: 5b7a97508e00501ceaf66030,
  name: '张三',
  class: '1',
  stunum: '111',
  oldpassword: '111',
  course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等数学'
      },
     { _id: 5b7a97508e00501ceaf66031,
       teacher: '赵六',
       courseName: '线性代数'
        } ],
  __v: 0 }

你期待的结果是什么?实际看到的错误信息又是什么?

想要只返回这一条数据

 course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等数学'
      }]

原来我的写法是 student.find({stunum:'1',courseName:'高等数学',teacher:'李四'});
但是返回的结果是

course:
   [ { _id: 5b7a97508e00501ceaf66032,
       teacher: '李四',
       courseName: '高等数学'
      },
     { _id: 5b7a97508e00501ceaf66031,
       teacher: '赵六',
       courseName: '线性代数'
        } ]}

怎么才能得到想要的结果啊,请各位指点指点,谢谢!

阅读 2k
1 个回答
student.aggregate([
    {
        $match:{stunum:'1'}
    },{
        $unwind:{
            path:'$course',
            preserveNullAndEmptyArrays: true,
        }
    },{
        $match:{courseName:'高等数学',teacher:'李四'}
    },{
        $project:{
            course:1
        }
    }
])

这样应该会得到

course:{ 
    _id: 5b7a97508e00501ceaf66032,
    teacher: '李四',
    courseName: '高等数学'
}

如果只是想修改值,那就不需要取出来,直接修改就可以了

student.update(
    {stunum:'1'},
    {
        $set:{'course.$[element].teacher':'张三'}
    },
    {arrayFilters:[{'element.teacher':'李四'}]}
)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题